5

我在 Mac OSX Leopard 上使用 Python。

我正在尝试从 Python 运行程序“点”(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

我没有收到任何答复。

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

4

12 回答 12

10

whereis定位手册页,which定位二进制文​​件。所以试试which dot

于 2009-06-05T12:01:06.363 回答
3

您需要将路径添加到 Python 环境中的“点”可执行文件。您可以通过修改 os.environ 中的 PATH 变量来做到这一点

于 2009-06-05T12:04:09.117 回答
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"])

从这个问题中获取,试图在这里保持某种理智。

于 2009-06-05T15:15:33.770 回答
2

故障排除提示:

A. 添加

print os.getcwd()

在 os.system("dot etc.

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

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

which dot

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

于 2009-06-05T12:03:29.197 回答
2

两个建议

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

改变这个

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

对此

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

那你的好。

编辑:请注意,我自己忘记从 PATH 变量中删除 /dot(哎呀) - PATH 是一个以冒号分隔的目录列表。

于 2009-06-05T12:35:39.600 回答
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')
于 2009-06-05T13:04:49.010 回答
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)

编辑:

如果是的话,我不记得了

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

或者

/usr/local/bin/dot -o 9.png -Tpng fdot.dot
于 2009-06-05T13:07:52.157 回答
2

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

于 2009-06-05T13:07:56.117 回答
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(并显示返回状态)。如果当前路径中不存在点,则会在 Linux 上引发 OSError 或在 Windows 上引发 WindowsErroor(我不知道在 Mac OS 下引发了哪个异常,但我假设是 OSError)。

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

于 2009-06-05T12:38:09.470 回答
1

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

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

可执行文件名是数组中的第一项,每个参数必须在数组的另一项中。否则,您将始终收到“没有此类文件”错误,因为您的 PATH 中没有名为“dot -o9.png ...”的可执行文件。

于 2009-06-05T13:52:01.363 回答
1

这一行有一个问题:

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

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

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

正如另一条评论中所指出的, 的论点check_callos.system.

于 2009-06-05T14:28:02.757 回答
0

如果您使用的是 GUI,Spyder那么您只需将正确的 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 就可以了。

于 2016-05-05T20:59:57.167 回答