subprocess.call()与脚本和解释器的工作方式不同

时间:2014-02-21 06:16:05

标签: python python-2.7 subprocess

想要通过以下代码从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给了我一个正确的目录。使用硬编码值进行调用与使用变量调用相同。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

以下是可能帮助的一些指示。

首先:根据我的经验args = [...]容易出错。

shlex.split('dot {0} -Tpng -o {1}'.format(input_file, image_name))

通常更健壮。但是,它要求您正确地转义文件名中的空格...

第二个:您的args中的输入和输出文件是否已颠倒?或者这些变量的名称很差?

第三次:请为了蟒蛇的禅和你自己的理智,不要做diaper antipattern例如except:

第四个:依赖于$PATH和/或使用二进制的非绝对路径必然会在某个时刻中断 - 使用完整的/path/to/dot作为您的第一个参数