从Popen()

时间:2016-05-28 06:04:29

标签: python subprocess popen

首先说明设置和目标;我安装了Core并运行了一个会话,我希望从python脚本运行一些命令。由于只有很少的命令而且它们是相当简单的命令,因此我只需使用subprocess.Popencoresendmsg,而不是尝试在我的脚本中实现核心控制平面。

命令的一个示例(从CLI运行)如下:

coresendmsg exec node=2 num=1001 cmd='ifconfig eth0 192.168.0.1'

我从python运行此命令并让coresendmsg正确解析cmd参数时遇到了一些问题。如果运行如下所示,coresendmsg将eth0和192.168.0.1视为单独的参数和扼流圈,这对我来说很有意义。

s=subprocess.Popen(['coresendmsg', 
    'exec',
    '-s 47854',
    'node=2',
    'num=1001',
    'cmd=ifconfig eth0 192.168.0.1'])

如果我将其更改为以下内容,coresendmsg现在将cmd视为单个参数,但仍然会窒息,因为当参数在coresendmsg中拆分时,现在会包含单引号。这与使用相同引号从命令行运行coresendmsg时不同,如上例所示。

s=subprocess.Popen(['coresendmsg', 
    'exec',
    '-s 47854',
    'node=2',
    'num=1001',
    'cmd=\'ifconfig eth0 192.168.0.1\''])

我知道这是因为我进去并修改了coresendmsg来打印参数并检查了两种情况。当上面的命令从CLI运行时,我看到了:

['exec', 'node=2', 'num=1001', 'cmd=ifconfig eth0 192.168.0.1']

但是当从python运行时,我会得到以下其中一项,具体取决于我引用的方式:

['exec', 'node=2', 'num=1001', 'cmd=ifconfig', 'eth0', '192.168.0.1']
['exec', 'node=2', 'num=1001', "cmd='ifconfig eth0 192.168.0.1'"]
['exec', 'node=2', 'num=1001', 'cmd="ifconfig eth0 192.168.0.1"']

我可以从bash脚本开始这项工作,但我不想从脚本,脚本和脚本运行脚本。寻找可能解决此问题的任何建议。

1 个答案:

答案 0 :(得分:1)

为了澄清@HaiVu所说的内容,您的第一个示例由于-s 47854而不是cmd参数而失败。在您的示例中,传递了"-s 47854"的单个参数。根据程序中参数的解析方式,node=2的值可能会-s

由于您使用的是列表,因此空格不会分隔参数,因此:

s=subprocess.Popen(['coresendmsg',
    'exec',
    '-s', '47854',
    'node=2',
    'num=1001',
    'cmd=ifconfig eth0 192.168.0.1'])

您可以预期引用差异的实验。从shell(“命令行”)运行时,shell会删除引号。如果你考虑的话,从Python运行也会删除引号。如果你转义引号,它们将直接传递,无论是在python还是bash中。

如果您需要其他shell行为,请使用shell=True参数Popen。在这种情况下,这不是必需的,并且在大多数情况下可以避免。