您的位置:首页 > 运维架构 > Shell

python:通过python脚本快速执行 bash 命令

2017-08-03 00:19 531 查看
* git镇楼:
git config --global core.filemode false
*

实践出真知。虽然这个脚本代码量不大,但是也是经过3次修改才达到预期效果的。

* 第一次写的时候,凭逻辑认为代码是正确的,可以达到预期效果。但是拿到服务器上运行发现有问题
* 第二次,在本地简单模拟了服务器的目录结构,测试通过了。但是拿到服务器运行,发现依然没有达到预期效果。
* 第三次,为了让代码能正确执行,并达到预期效果。在代码中输出了当前执行路径,并在服务器上验证通过了。


如何利用
python
执行
bash
脚本?


如何像
cd xxx/
一样任性跳转目录执行
bash
命令?


这两个问题解决了,才算是解决了使用
python
脚本执行
bash
命令的全部痛点。


一一解答:

如何利用
python
执行
bash
脚本?

os.popen(bash_comand)
即可

如何像
cd xxx/
一样任性跳转目录执行
bash
命令?

os.chdir(path)
就如同
cd xxx/
一般,可以任性地切换到任意目录

于是,就有了如下代码 :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @name   : find_t.py
# @author : cat
# @date   : 2017/8/2.

import os
import time

def bash_shell(bash_command):
"""
python 中执行 bash 命令
:param bash_command:
:return: bash 命令执行后的控制台输出
"""
try:
return os.popen(bash_command).read().strip()
except:
return None

def find_target(target_path="./../", key='.git'):
"""
查找目标目录所在的目录 : 如 /aa/bb/.git --> return /aa/bb/
:param target_path:
:param key: target
:return:
"""
walk = os.walk(target_path)
for super_dir, dir_names, file_names in walk:
for dir_name in dir_names:
if dir_name == key:
dir_full_path = os.path.join(super_dir, dir_name)
# print(dir_full_path, super_dir, dir_name, sep=" ## ")
yield super_dir

if __name__ == '__main__':
print("start execute bash ...........")
st = time.time()
cwd = os.getcwd()
# this for repo
for repo_path in find_target(os.getcwd(), key='.repo'):
os.chdir(repo_path)
if repo_path == os.getcwd():
print('find repo in -->', repo_path)
print(bash_shell('pwd'))
print(bash_shell('repo forall -c git config core.fileMode false --replace-all'))

else:
print('error in chdir 2 {}'.format(repo_path))
if os.getcwd() != cwd:
os.chdir(cwd)
if os.getcwd() != cwd:
print('change 2 cwd FAIL !!!  {}'.format(cwd))

# this for git
for git_path in find_target(os.getcwd(), key='.git'):
os.chdir(git_path)
if git_path == os.getcwd():
print('find git in -->', git_path)
print(bash_shell('pwd'))
print(bash_shell('git config --global core.filemode false'))
else:
print('error in chdir 2 {}'.format(git_path))
if os.getcwd() != cwd:
os.chdir(cwd)
if os.getcwd() != cwd:
print('change 2 cwd FAIL !!!  {}'.format(cwd))

et = time.time()
print('\n\n    #### execute finished in {:.3f} seconds ####'.format(et - st))
print('\n')
# test for bash_command
# print(bash_shell('git init'))
# print(bash_shell('ls -al'))


于是,执行之后的输出如下:

bash_command = pwd
/Users/cat/Desktop/testGit/a6
bash_command = pwd
/Users/cat/Desktop/testGit/a6/frameworks/base
bash_command = pwd
/Users/cat/Desktop/testGit/a6/packages/apps/Email
bash_command = pwd
/Users/cat/Desktop/testGit/a6/packages/apps/Music
bash_command = pwd
/Users/cat/Desktop/testGit/a6/packages/apps/Settings
bash_command = pwd
/Users/cat/Desktop/testGit/a6/vender/customer
spend time : 0.096 seconds
end  ####################  end

Process finished with exit code 0


通过输出可以看到,所有的
.repo
以及
.git
目录所在目录是已经找出来了。然后执行
bash_commad(command)
即可在仓库目录执行
git / repo
命令了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: