import argparse import os import subprocess parser = argparse.ArgumentParser(description='Execute different shell commands depending on the argument') parser.add_argument('--build', help='Execute split_build_helper.py') args = parser.parse_args() if args.build == 'all': os.system('python vendor/mediatek/proprietary/scripts/releasetools/split_build_helper.py --out-name project_mode --run full_aiv8195p1_64_bsp-userdebug') elif args.build == 'kernel': subprocess.call('source build/envsetup.sh && export OUT_DIR=out_aiv8195p1_64_bsp_userdebug && lunch vnd_aiv8195p1_64_bsp-userdebug && make krn_images', check=True, shell=True) else: print('No argument provided')
时间: 2024-03-17 17:43:26 浏览: 101
python2-subprocess32-3.2.6-14.el7.x86_64.rpm
这个程序的问题在于,在if语句块中使用了`os.system()`来执行命令,而在elif语句块中使用了`subprocess.call()`来执行命令。这会导致代码的一致性出现问题,并且会在不同的情况下使用不同的命令执行方式,这不利于代码的可读性和可维护性。
另外,在elif语句块中使用了`check=True`参数,但是`subprocess.call()`函数并不支持这个参数,这会导致代码运行出错。正确的做法应该是使用`subprocess.run()`函数来替代`subprocess.call()`函数,并将命令参数改为列表形式,这样就可以使用`check=True`参数来检测命令执行情况了。
因此,您可以尝试以下修改:
```python
import argparse
import subprocess
parser = argparse.ArgumentParser(description='Execute different shell commands depending on the argument')
parser.add_argument('--build', help='Execute split_build_helper.py')
args = parser.parse_args()
if args.build == 'all':
subprocess.run(['python', 'vendor/mediatek/proprietary/scripts/releasetools/split_build_helper.py', '--out-name', 'project_mode', '--run', 'full_aiv8195p1_64_bsp-userdebug'], check=True)
elif args.build == 'kernel':
subprocess.run(['cmd', '/c', 'call', 'build\\envsetup.bat', '&&', 'set', 'OUT_DIR=out_aiv8195p1_64_bsp_userdebug', '&&', 'lunch', 'vnd_aiv8195p1_64_bsp-userdebug', '&&', 'make', 'krn_images'], check=True, shell=True)
else:
print('No argument provided')
```
这里我们将所有的命令执行方式都改为了`subprocess.run()`函数,并将命令参数改为列表形式。同时,在elif语句块中使用了`cmd`命令来调用Windows的命令行解释器,并使用`/c`参数来执行后续的命令,和之前的修改方式类似。这样就可以保证代码的一致性,并且避免了参数错误的问题。
阅读全文