想要通过以下代码从python脚本运行二进制文件:
def runner(output_file):
result = 1
try:
image_name = re.sub(r'\..*', '.png', output_file)
args = ['dot', output_file, '-Tpng', '-o', image_name]
result = subprocess.call(args)
if(result == 0):
print('Graph is rendered to {0}'.format(image_name))
except:
print('ERROR: Cannot run DOT. Please check your PATH')
return result
当我调用此函数时,它返回0
,一切似乎都没问题,但没有生成文件。
当我从Python解释器中做同样的事情时:
Python 2.7.5+ (default, Sep 19 2013, 13:48:49)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> output_file = 'out.dot'
>>> image_name = 'out.png'
>>> args = ['dot', output_file, '-Tpng', '-o', image_name]
>>> subprocess.call(args)
文件已成功生成。
我试图设置一个不正确的名称,并在脚本中出错(正如预期的那样)。从脚本中调用pwd
给了我一个正确的目录。使用硬编码值进行调用与使用变量调用相同。
我做错了什么?
答案 0 :(得分:0)
以下是可能帮助的一些指示。
首先:根据我的经验args = [...]
容易出错。
shlex.split('dot {0} -Tpng -o {1}'.format(input_file, image_name))
通常更健壮。但是,它要求您正确地转义文件名中的空格...
第二个:您的args中的输入和输出文件是否已颠倒?或者这些变量的名称很差?
第三次:请为了蟒蛇的禅和你自己的理智,不要做diaper antipattern例如except:
第四个:依赖于$PATH
和/或使用二进制的非绝对路径必然会在某个时刻中断 - 使用完整的/path/to/dot
作为您的第一个参数