如何从Python运行“dot”作为命令?

时间:2009-06-05 11:55:10

标签: python macos path graphviz dot

我在Mac OSX Leopard上使用Python。

我正在尝试从Python运行程序'dot'(Graphviz的一部分):

# -*- coding: utf-8 -*-
import os

print os.environ['PATH']
print os.system("ls >> a.txt")
print os.system("dot -o9.png -Tpng ./6.dot")

命令“ls”只是为了确保python在正确的目录中。它是。我得到的结果是:

  

的/ usr / bin中:/ bin中:/ usr / sbin目录:/ sbin目录   0   32512

我的理解是32512错误意味着python找不到文件,因为文件6.dot就在那里(如果我从终端运行“dot -o9.png -Tpng ./6.dot”我收到没有错误,并且9.png被生成),我假设Python找不到点文件。

我可能需要将点文件添加到路径中。但我不知道它在哪里。如果我跑:

whereis dot

我没有得到答案。

如何找到点可执行文件?
或者,我可以将Python程序作为命令从Python内部运行吗?

12 个答案:

答案 0 :(得分:10)

whereis找到手册页,which找到二进制文件。所以试试which dot

答案 1 :(得分:3)

您需要在Python环境中添加“dot”可执行文件的路径。您可以通过修改os.environ

中的PATH变量来完成此操作

答案 2 :(得分:3)

试试这个:

# -*- coding: utf-8 -*-
import os
import sys

print os.environ['PATH']

os.environ['PATH'] += ":"+"/usr/local/bin"
print os.environ['PATH']

print os.getcwd()

from subprocess import check_call
print check_call(["dot", "-o9.png", "-Tpng", "./6.dot"])

从问题中考虑,试图在这里保持某种理智。

答案 3 :(得分:2)

故障排除提示:

一个。添加

print os.getcwd()

在os.system之前的行上(“dot etc。

只是为了确保当前目录是具有6.dot文件的目录。

B中。确保dot程序在您的路径中。

which dot

℃。使用os.system命令中dot程序的完整路径,看看会发生什么。

答案 4 :(得分:2)

两个建议

  1. 不要使用PATH,而是使用“which”来找到可执行文件
  2. 你不使用“;” (分号)分隔路径,但是“:”(冒号)。一旦你改变它,它应该能够找到你的点程序。
  3. 更改此

    os.environ['PATH'] += ";"+"/usr/local/bin/dot"
    

    到这个

    os.environ['PATH'] += ":"+"/usr/local/bin"
    

    然后你的好。

    编辑:请注意,我忘了从PATH变量中删除/ dot(oops) - PATH是以冒号分隔的目录列表。

答案 5 :(得分:2)

如果您还使用Python生成Dot文件,pydot以更加Pythonic的方式执行您想要的操作:

import pydot
dot = pydot.Dot()
n1, n2 = pydot.Node("a"), pydot.Node("b")
dot.add_node(n1)
dot.add_node(n2)
dot.add_edge(pydot.Edge(n1,n2))
dot.write_png("graph.png", prog='neato')

答案 6 :(得分:2)

解决方案常常摆在我们面前,

print os.system("/usr/local/bin/dot -o9.png -Tpng 6.dot")

您也可以尝试指定文件夹中的所有点

import glob
for filedot in glob.glob('*.dot')
    print os.system("/usr/local/bin/dot -o9.png -Tpng %(filedot)s"%locals())
    #print os.system("/usr/local/bin/dot -o9.png -Tpng %s"%filedot)

编辑:

我不记得btw是否

/usr/local/bin/dot -o9.png -Tpng fdot.dot

/usr/local/bin/dot -o 9.png -Tpng fdot.dot

答案 7 :(得分:2)

您应该更改PATH行,使其包含包含dot的目录。该目录为/usr/local/bin,没有/dot

答案 8 :(得分:1)

而不是:

print os.system("dot -o9.png -Tpng ./6.dot")

试试这个:

from subprocess import check_call
print check_call("dot -o9.png -Tpng ./6.dot")

如果点程序的退出状态为0,则打印状态。如果dot返回非零状态,则会引发CalledProcessError(并显示返回状态)。如果当前路径中不存在dot,则在Linux上引发OSError或在Windows上引发WindowsErroor(我不知道在Mac OS下引发了哪个异常,但我认为是OSError)。

编辑:如果在当前路径设置中没有点可执行文件或6.dot文件,上面的代码将为您提供提示。

答案 9 :(得分:1)

check_call使用与os.system相同的语法,因此您应尝试以这种方式更改相应的行:

print check_call(["dot", "-o9.png", "-Tpng", "./6.dot"])

可执行文件名是数组中的第一项,每个参数必须位于数组的另一项中。否则,总是得到“没有这样的文件”错误,因为PATH中没有名为“dot -o9.png ...”的可执行文件。

答案 10 :(得分:1)

这一行存在一个问题:

os.environ['PATH'] += ":"+"/usr/local/bin/dot"

您不会将可执行文件的名称放在路径中,而是包含可执行文件的目录。那应该是:

os.environ['PATH'] += ":"+"/usr/local/bin"

正如另一条评论所指出的,check_call的论据与os.system不同。

答案 11 :(得分:0)

如果您使用的是Spyder等GUI,则只需将正确的bin路径添加到PYTHONPATH manager选项菜单中即可。

通过在终端中执行此操作来搜索脚本位置:

which programname

然后取该位置(无论它在哪里),减去程序名,例如:

/home/username/seiscomp3/bin/scart
#this is the section of the path that you use
/home/username/seiscomp3/bin

然后进入PYTHONPATH manager选项菜单并添加此路径。然后重启Spyder,它会工作。