我在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内部运行吗?
答案 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)
两个建议
更改此
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,它会工作。