我有一个脚本通过subprocess.Popen
调用另一个Python脚本。但是因为我有存储在变量中的参数
servers[server]['address']
servers[server]['port']
servers[server]['pass']
我无法执行该命令
p = subprocess.Popen(
["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"],
shell=True,
stdout=subprocess.PIPE
)
6条答案
按热度按时间lo8azlld1#
跌落
shell=True
. The arguments toPopen()
are treated differently on Unix ifshell=True
:请注意,为带有外部输入的命令传递
shell=True
是一个安全隐患,如文档中的警告所述。bxgwgixi2#
当你调用
subprocess.Popen
的时候,你可以传递一个字符串或者一个列表来运行命令,如果你传递一个列表,那么这些项应该以一种特定的方式被分割。在您的情况下,您需要像这样拆分它:
这是因为,如果传入一个列表,
Popen
会假设您已经将命令行拆分为单词(最终将出现在sys.argv
中的值),因此它不需要这样做。按照您的说法,它将尝试运行一个名为“pythonmytool.py”的二进制文件,这不是您的意思。
另一种解决方法是将所有的单词连接成一个字符串(
Popen
将拆分该字符串-请参见subprocess.list2cmdline
).但是如果可能的话,最好使用列表版本-它可以更简单地控制命令行如何拆分(例如,如果参数中有空格或引号),而不必纠结于引号字符。lstz6jyr3#
您在为第一个
Popen
参数键入str
时出现问题。请将其替换为list
。下面的代码可以正常工作:如果
command
参数来自受信任的来源,您可以构造command
并将其与shell=True
一起使用,如下所示:注1:使用
shell=True
构造的command
可能不安全。使用pipes.quote()
以减少注入可能性。注2:
pipes.quote()
自python2
以来已弃用;对于python3
,请使用shlex
模块。kxxlusnw4#
您应该将命令连接为整个字符串:
ljsrvy3e5#
您可以通过传递
在子进程调用中。
ef1yzkbh6#
使用情况
运行n个shell脚本或python脚本
创建一个run.py文件,负责将参数(整数)传递给shell文件。
假设你想运行n(4)个shell脚本或者python脚本,它们接受1个参数。
用下面的代码创建一个文件run.python。
下面的代码说明
运行shell脚本
运行python脚本
运行此文件时使用
Pythonrun.py
MacOS上的权限问题
修改ug+x mockScript.sh
修改ug+x run.py
所有代码均在Python 3.8.1和MacOs 12.0.1环境下测试。