在另一个目录的.exe上调用subprocess.call()

时间:2018-10-25 12:25:41

标签: python subprocess graphviz

我有一些.dot文件,我想使用python转换为pdf。命令如下:

dot -Tpdf -o output.pdf input.dot

如果我直接从cmd执行该命令,则该命令有效。但是使用Pythons subprocess.call 无效。

dot.exe位于一个依赖于其他文件的单独目录中,我尝试这样运行它:

subprocess.call(['C:/graphviz-2.38/release/bin/', 'dot', '-Tpdf', '-o ' + file + '.pdf' + file])

这样(将“点”添加到路径中)

subprocess.call(['C:/graphviz-2.38/release/bin/dot', '-Tpdf', '-o' + file + '.pdf' + file])

后者仅运行dot.exe并且不接受任何参数,前者给我以下错误:

    Traceback (most recent call last):
  File "xmltodot2.py", line 22, in <module>
    subprocess.call(['C:/graphviz-2.38/release/bin/', 'dot', '-Tpdf', '-o ' + file + '.pdf' + file])
  File "C:\Python27\lib\subprocess.py", line 172, in call
    return Popen(*popenargs, **kwargs).wait()
  File "C:\Python27\lib\subprocess.py", line 394, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 644, in _execute_child
    startupinfo)
WindowsError: [Error 5] Access is denied

如何运行与另一个目录中其目录中的文件具有依赖性的dot.exe?

我是Python的新手,不确定语法。

谢谢!

编辑:

完整代码

import os, fnmatch, subprocess, string
from subprocess import call

# opens the directory
listOfFiles = os.listdir('.')
# file extensions to look for
pattern = "*.xml"
pattern2 = "*.dot"
path = "C:/graphviz-2.38/release/bin"

#Converts every dot-file in the directory to pdf
for file in listOfFiles:
if fnmatch.fnmatch(file, pattern2):
    os.chdir(path)
    subprocess.call(['C:/graphviz-2.38/release/bin/dot', '-Tpdf', '-o' +         
file + '.pdf', file])
    print("Converted " + file + " to pdf")

1 个答案:

答案 0 :(得分:0)

  1. 您可以尝试从脚本内更改工作目录以控制执行上下文。就像命令行复制中的cd一样。 os.chdir是更改cwd的标准库方法。

  2. 确保脚本具有足够的权限运行。