将带有args的命令传递给子进程.波本



当我尝试将批处理文件(不需要任何参数(传递给函数时,以下脚本可以很好地工作。

script_as_var = os.path.join(os.environ['SOME_VAR'], 'bin/stop.bat')
jboss = os.path.join(os.environ['JBOSS_HOME'], 'bin/jboss-cli.bat')
def status(some_arg, cmd, more_arg):
print('CMD: ' + cmd)
ps = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output = ps.communicate()[0]
...
...
status(10, script_as_var, 'last_arg')   # Works fine

然而,当我尝试将下面的命令传递给函数时,它失败了。

status(15, '[jboss,'"'-c'"','"'--commands="'"read-attribute server-state"'"'"']',
'some_arg')

输出:

CMD: [jboss,'-c','--commands='"read-attribute server-state"'']
...
FileNotFoundError: [WinError 2] The system cannot find the file specified

当我没有创建函数时,下面的命令曾经很好地工作。

ps = subprocess.Popen([jboss,'-c','--commands='"read-attribute server-state"''],
stdout=subprocess.PIPE)

print命令的输出中可以注意到,我成功地(通过使用混乱的单引号和双引号组合(传递了在未创建此函数时能够运行的确切命令,但似乎还需要对jboss变量进行一些扩展。

知道我该怎么解决吗?

subprocess.Popen构造函数将接受字符串或类似list的序列作为其第一个名为args的参数。您的代码似乎正在尝试同时使用。。。下面是如何正确地做到这一点。正如您所看到的,它还根据需要扩展了jboss变量。

import os
os.environ['SOME_VAR'] = 'some_var'          # For testing
os.environ['JBOSS_HOME'] = 'jboss_home_var'  # For testing
script_as_var = os.path.join(os.environ['SOME_VAR'], 'bin/stop.bat')
jboss = os.path.join(os.environ['JBOSS_HOME'], 'bin/jboss-cli.bat')
def status(some_arg, cmd, more_arg):
print('CMD: ' + repr(cmd))
#    ps = subprocess.Popen(cmd, stdout=subprocess.PIPE)
#    output = ps.communicate()[0]
#    ...
#    ...
status(10, script_as_var, 'last_arg')
status(15, [jboss, '-c', '--commands="read-attribute server-state"'], 'some_arg')

输出:

CMD: 'some_var\bin/stop.bat'
CMD: ['jboss_home_var\bin/jboss-cli.bat', '-c', '--commands="read-attribute server-state"']

您正在为命令传递str。请注意,您的工作示例有一个list。你只需要去掉所有多余的引用并传递一个列表。

>>> def foo(a, b, c):
print(b) 
>>> jboss = 42
>>> foo(15,'[jboss,'"'-c'"','"'--commands="'"read-attribute server-state"'"'"']','some_arg')
[jboss,'-c','--commands="read-attribute server-state"']
>>> foo(15,[jboss,'-c','--commands="read-attribute server-state"'],'some_arg')
[42, '-c', '--commands="read-attribute server-state"']

最新更新