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 --out-name project_mode --run full_aiv8195p1_64_bsp-userdebug') 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(['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') 这个程序有什么问题吗
时间: 2023-10-03 22:07:05 浏览: 39
这个程序有一个问题。在执行if语句块和elif语句块时,都使用了`check=True`参数,这会导致如果命令执行出错,程序就会抛出异常并终止运行。但是,在elif语句块中使用了`shell=True`,这意味着命令将在一个子shell中执行,这将使`check=True`无效,因为它只能检测主shell中的命令执行情况,而无法检测子shell中的命令执行情况。因此,应该将`shell=True`移动到`subprocess.run()`的参数中,并且不应在elif语句块中使用`check=True`参数。
相关问题
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')
这个程序的问题在于,在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`参数来执行后续的命令,和之前的修改方式类似。这样就可以保证代码的一致性,并且避免了参数错误的问题。
p = subprocess.Popen(self.command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
这是 Python 中使用 subprocess 模块执行外部命令的代码片段。其中,self.command 是一个字符串类型的命令,shell=True 表示在 shell 环境下执行该命令,stdout=subprocess.PIPE 表示将该命令的标准输出保存到一个管道中,stderr=subprocess.STDOUT 表示将标准错误输出重定向到标准输出管道中。执行命令后,该代码会返回一个 Popen 对象,可以使用该对象来获取命令的标准输出和标准错误输出。