首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当多个参数包含空格时,如何使用子进程?

当多个参数包含空格时,如何使用子进程?
EN

Stack Overflow用户
提问于 2009-04-30 01:17:04
回答 10查看 36.4K关注 0票数 23

我正在开发一个包装器脚本,它将执行vmware可执行文件,允许虚拟机启动/关闭/注册/取消注册操作的自动化。我尝试使用子进程来处理对可执行文件的调用,但是子进程没有正确处理可执行文件路径和参数中的空格。下面是一个代码片段:

代码语言:javascript
复制
vmrun_cmd = r"c:/Program Files/VMware/VMware Server/vmware-cmd.bat"
def vm_start(target_vm):
    list_arg = "start"
    list_arg2 = "hard"
    if vm_list(target_vm):
            p = Popen([vmrun_cmd, target_vm, list_arg, list_arg2],   stdout=PIPE).communicate()[0]
            print p
    else:
            vm_register(target_vm)
            vm_start(target_vm)
def vm_list2(target_vm):
    list_arg = "-l"
    p = Popen([vmrun_cmd, list_arg], stdout=PIPE).communicate()[0]
    for line in p.split('\n'):
            print line

如果我调用vm_list2函数,我会得到以下输出:

代码语言:javascript
复制
$ ./vmware_control.py --list                                                
C:\Virtual Machines\QAW2K3Server\Windows Server 2003 Standard Edition.vmx
C:\Virtual Machines\ubunturouter\Ubuntu.vmx
C:\Virtual Machines\vacc\vacc.vmx
C:\Virtual Machines\EdgeAS-4.4.x\Other Linux 2.4.x kernel.vmx
C:\Virtual Machines\UbuntuServer1\Ubuntu.vmx
C:\Virtual Machines\Other Linux 2.4.x kernel\Other Linux 2.4.x kernel.vmx
C:\Virtual Machines\QAClient\Windows XP Professional.vmx

如果我调用vm_start函数,它需要一个到vm的路径参数,我会得到以下输出:

代码语言:javascript
复制
$ ./vmware_control.py --start "C:\Virtual Machines\ubunturouter\Ubuntu.vmx"
'c:\Program' is not recognized as an internal or external command,
operable program or batch file.

显然,带有嵌入空格的第二个参数的存在正在改变子进程解释第一个参数的方式。对如何解决这个问题有什么建议吗?

python2.5.2/cygwin/winxp

EN

回答 10

Stack Overflow用户

发布于 2009-04-30 13:41:11

如果路径中有空格,我找到的正确解释它们的最简单方法是这样的。

代码语言:javascript
复制
subprocess.call('""' + path + '""')

我不知道它到底为什么需要双引号,但这是有效的。

票数 8
EN

Stack Overflow用户

发布于 2009-04-30 01:46:59

代码语言:javascript
复制
'c:\Program' is not recognized as an internal or external command,
operable program or batch file.

要获取此消息,请执行以下任一操作:

使用shell=True

vmrun_cmd = r"c:\Program Files\VMware\VMware Server\vmware-cmd.bat“subprocess.Popen(代码的其他部分中的vmrun_cmd,vmware vmrun_cmd

  • 从vmware-cmd.bat

内部获取此错误

可以尝试的内容:

  • 打开python提示符,运行以下命令:

subprocess.Popen(r"c:\Program Files\VMware\VMware Server\vmware-cmd.bat")

如果这是可行的,那么引用问题是不可能的。如果不是,那么您已经隔离了问题。

票数 4
EN

Stack Overflow用户

发布于 2009-04-30 02:00:13

我相信处理列表参数的list2cmdline()会在空格上拆分任何字符串参数,除非字符串包含双引号。所以我希望

代码语言:javascript
复制
vmrun_cmd = r'"c:/Program Files/VMware/VMware Server/vmware-cmd.bat"'

成为你想要的。

您还可能希望用双引号将其他参数(如target_vm)括起来,前提是它们也分别表示一个不同的参数,以提供给命令行。就像这样

代码语言:javascript
复制
r'"%s"' % target_vm

(例如)应该适合。

请参阅the list2cmdline documentation

达阿

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/804995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档