当我尝试将批处理文件(不需要任何参数(传递给函数时,以下脚本可以很好地工作。
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"']