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) 这句话我执行有错误
时间: 2024-03-17 16:43:23 浏览: 260
在Windows系统下,`source`和`export`这两个命令是不被支持的,因为它们是Linux/Unix系统中的命令。在Windows系统中,可以使用`set`命令来设置环境变量,而不是使用`export`命令。
因此,您可以将这句话修改为以下内容:
```python
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)
```
这里我们使用`cmd`命令来调用Windows的命令行解释器,并使用`/c`参数来执行后续的命令。使用`call`命令来调用`build\\envsetup.bat`脚本文件,使用`set`命令来设置环境变量,使用`&&`来连接多个命令,并使用`make`命令来编译内核镜像。这样就可以在Windows系统上执行这个命令了。
相关问题
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`参数来执行后续的命令,和之前的修改方式类似。这样就可以保证代码的一致性,并且避免了参数错误的问题。
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') 这个程序有什么问题吗
这个程序有一个问题。在执行if语句块和elif语句块时,都使用了`check=True`参数,这会导致如果命令执行出错,程序就会抛出异常并终止运行。但是,在elif语句块中使用了`shell=True`,这意味着命令将在一个子shell中执行,这将使`check=True`无效,因为它只能检测主shell中的命令执行情况,而无法检测子shell中的命令执行情况。因此,应该将`shell=True`移动到`subprocess.run()`的参数中,并且不应在elif语句块中使用`check=True`参数。
阅读全文