subprocess.call失败,而手动执行起作用

时间:2014-01-25 20:15:21

标签: python subprocess

我想执行以下命令

pdflatex -interaction=nonstopmode -shell-escape "fontsample - Latin Modern Family.tex"

从控制台完美无缺。

在python中,我执行以下代码

tex.callSystemCommand(['pdflatex', '-interaction=nonstopmode', '-shell-escape', '"' + filename + '.tex"'])

def callSystemCommand(command):
    try:
        retcode = subprocess.call(command) # shell=True
        if retcode != 0:
            print("System command was terminated by signal", -retcode, file=sys.stderr)
            sys.exit()
    except OSError as e:
        print("Execution failed:", e, file=sys.stderr)

以-1失败。我想知道究竟是什么执行。

编辑: 执行正常

    executeCode = 'pdflatex.exe -interaction=nonstopmode  -shell-escape "' \
                 + filename + '"'
    os.system(executeCode)

2 个答案:

答案 0 :(得分:1)

该命令可能会失败,因为它找不到名为"somefilename"的文件。通常,shell将处理"中包含的参数,将它们剥离并将文件名(带空格)作为单个参数传递。当您将参数subprocess传递给shell=True时,参数将按原样传递给pdflatex子流程,文件名本身不会以“”开头或结尾,因此它不存在。程序pdflatex可能会退出此代码,因为它无法找到文件名。

尝试以下方法:

tex.callSystemCommand(['pdflatex', '-interaction=nonstopmode', '-shell-escape', filename + '.tex'])

此外,在您展示工作的示例中(使用os.system),您没有在文件名中添加.tex,因此它取决于您如何将其提供给python脚本,这可能是解决方案:

tex.callSystemCommand(['pdflatex', '-interaction=nonstopmode', '-shell-escape', filename ])

答案 1 :(得分:-2)

你可以试试这个:

import subprocess
subprocess.Popen(['pdflatex', '-interaction=nonstopmode',
                     '-shell-escape', filename + '.tex'], shell=True)