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 17:07:05 浏览: 158
这个程序有一个问题。在执行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`参数来执行后续的命令,和之前的修改方式类似。这样就可以保证代码的一致性,并且避免了参数错误的问题。
import sys import argparse import subprocess def banner(): text = '''' {\____/} (。◕ˇ∀ˇ◕) /つ🍑x-tools''' print(text) def Main(): banner(); # dbhost = sys.argv[1] # dbprot = sys.argv[2] # dbuser = sys.argv[3] # dbpassword = sys.argv[4] helpinfo = ("[?]CommandLine:\n" + "\t-h\t--host\t\tmysql host\n" + "\t-p\t--port\t\tmysql port\n" + "\t-user\t--username\tmysql username\n" + "\t-pass\t--password\tmysql password\n" + "\t-help\t--help\t\thelp info\n\n" + "eg:java -jar MySQLMonitor.jar -h 127.0.0.1 -user CoolCat -pass mysqlmonitor"); parser = argparse.ArgumentParser() # 添加参数 parser.add_argument('-p', '--port', help='端口号') parser.add_argument('ip', help='IP地址') parser.add_argument('-db', '--dbhost', help='数据库地址') # 解析命令行参数 args = parser.parse_args() # 构建命令 command = ['x-tools.py', '-h', '-db', args.dbhost, '-p', args.port, args.ip] # 运行命令并获取输出 output = subprocess.check_output(command, stderr=subprocess.STDOUT, universal_newlines=True) # 打印输出 print(output) Main();控制台运行x-tools.py -h 127.0.0.1 -p 8888运行之后输出 IP和端口
根据你的描述,你想要运行 `x-tools.py -h 127.0.0.1 -p 8888` 命令并获取输出。以下是你提供的代码,稍作修改:
```python
import argparse
import subprocess
def banner():
text = ''''{\____/}
(。◕ˇ∀ˇ◕)
/つ🍑x-tools'''
print(text)
def Main():
banner()
# dbhost = sys.argv[1]
# dbprot = sys.argv[2]
# dbuser = sys.argv[3]
# dbpassword = sys.argv[4]
helpinfo = ("[?]CommandLine:\n" +
"\t-h\t--host\t\tmysql host\n" +
"\t-p\t--port\t\tmysql port\n" +
"\t-user\t--username\tmysql username\n" +
"\t-pass\t--password\tmysql password\n" +
"\t-help\t--help\t\thelp info\n\n" +
"eg:java -jar MySQLMonitor.jar -h 127.0.0.1 -user CoolCat -pass mysqlmonitor")
parser = argparse.ArgumentParser()
# 添加参数
parser.add_argument('-p', '--port', help='端口号')
parser.add_argument('ip', help='IP地址')
parser.add_argument('-db', '--dbhost', help='数据库地址')
# 解析命令行参数
args = parser.parse_args()
# 构建命令
command = ['x-tools.py', '-h', args.ip, '-p', args.port]
# 运行命令并获取输出
output = subprocess.check_output(command, stderr=subprocess.STDOUT, universal_newlines=True)
# 打印输出
print(output)
Main()
```
这段代码会解析 `-p`、`ip` 参数,并将它们作为参数传递给 `x-tools.py` 命令。在 `command` 列表里只需要将 `-h` 参数改为 `args.ip`,并将 `-p` 参数改为 `args.port` 即可。运行后会输出命令的输出结果。
阅读全文
相关推荐
















