首先说明设置和目标;我安装了Core并运行了一个会话,我希望从python脚本运行一些命令。由于只有很少的命令而且它们是相当简单的命令,因此我只需使用subprocess.Popen
来coresendmsg,而不是尝试在我的脚本中实现核心控制平面。
命令的一个示例(从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脚本开始这项工作,但我不想从脚本,脚本和脚本运行脚本。寻找可能解决此问题的任何建议。
答案 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
。在这种情况下,这不是必需的,并且在大多数情况下可以避免。