子时间文本2无法运行带有空格和引号的windows命令

2024-09-30 18:34:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个生成Windows命令的小Python脚本:

def quoted(s):
    return '"' + s + '"'

import os
path = 'C:\\Program Files\\SumatraPDF\\SumatraPDF.exe'
params = ' -page 5 '
arg = 'D:\\Dropbox\\Final Term\\Final Draft.pdf'
cmd = quoted(path) + params + quoted(arg)
print cmd
os.system(cmd)

这不会在Sublime文本2中运行(按Ctrl+B):

^{pr2}$

但是如果我手动复制并粘贴命令(由这个脚本输出)到cmd.exe,则会运行。在

我该怎么做?在


Tags: pathimport命令脚本cmdreturnoswindows
3条回答

这是文件路径中的空间问题(在Windows上是个问题)。操作系统()打开命令shell,此行为是从命令shell继承的。如果您打开“DOS box”并键入 同样的事情,你也会得到同样的结果——Windows命令shell需要用内嵌空格来引用路径。你应该用另一对引号。在

正如其他人所建议的,subprocess模块可能是最好的解决方案。在

然而,值得注意的是,微软视窗仍然提供旧的8.3文件名翻译,以与旧的MS-DOS程序兼容。您可以通过在cmd.exe中运行dir /X来找到翻译,这通常表明C:\Program Files可以被称为C:\Progra~1。在

在你的情况下,以下。。。在

import os
path = 'C:\\Progra~1\\SumatraPDF\\SumatraPDF.exe'
params = ' -page 5 '
arg = 'D:\\Dropbox\\FinalT~1\\FinalD~1.pdf'
cmd = path + params + arg
print cmd
os.system(cmd)

……应该有用。在

this answer, 崇高部分是辅助的,但是从python解释器,您可以测试它操作系统如果在整个字符串中使用双引号,则可以使用。但是,如果使用Popen,则不需要任何引号(它足够聪明,可以理解这一点)。在

例如

>>> cmd = '""C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe""'
>>> os.system(cmd)

或者

^{pr2}$

顺便说一下,从您的注释来看,不要用双引号括起路径,用双引号括起整个命令""path to exe with spaces" "arg1" "arg2" "arg3"",而且您确实不需要所有的内部引号,但它们不会造成伤害,这意味着它应该与""path to exe with spaces arg1 arg2 arg3""一起工作

相关问题 更多 >