如何运行“dot” 作为来自 Python 的命令?
我在 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
我没有收到任何答复。
如何找到 dot 可执行文件?
或者,我可以从 Python 内部将 dot 程序作为命令运行吗?
I am using Python on Mac OSX Leopard.
I am trying to run the program 'dot' (part of Graphviz) from Python:
# -*- coding: utf-8 -*-
import os
print os.environ['PATH']
print os.system("ls >> a.txt")
print os.system("dot -o9.png -Tpng ./6.dot")
The command "ls" is there just to make sure that python is in the correct directory. It is. The result that I get is:
/usr/bin:/bin:/usr/sbin:/sbin
0
32512
My understanding is that 32512 error means that python could not find the file, and since the file 6.dot is there (If I run "dot -o9.png -Tpng ./6.dot" from the terminal I receive no error, and 9.png gets produced), I assume Python can't find the dot file.
I probably need to add the dot file to the path. But I don't know where is it. If I run:
whereis dot
I receive no answer.
How can I find the dot executable?
Alternatively, can I run the dot program as a command from inside Python?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
whereis
定位手册页,which
定位二进制文件。 所以尝试哪个点
。whereis
locates man pages,which
locates binaries. So trywhich dot
.您需要在 Python 环境中添加“dot”可执行文件的路径。 您可以通过修改 os.environ 中的 PATH 变量来做到这一点
You need to add the path to the 'dot' executable in Python's environment. You can do this by modifying the PATH variable in os.environ
试试这个:
取自问题,尝试在这里保持某种理智。
Try this:
Taken from the question to try and maintain some sort of sanity here.
您应该更改 PATH 行,使其包含包含
dot
的目录。 该目录是/usr/local/bin
,没有/dot
。You should change the PATH line so it includes the directory which contains
dot
. That directory is/usr/local/bin
, without/dot
.疑难解答提示:
添加
print os.getcwd()
。A.在 os.system("dot 等) 之前
只是为了确保当前目录是带有
6.dot 的目录
文件。确保
dot
程序位于您的路径中。which dot
C. 使用
dot
的完整路径。 > 在 os.system 命令中进行编程,看看会发生什么。Troubleshooting tips:
A. add
print os.getcwd()
on the line before os.system("dot etc.
Just to make sure that the current directory is the one with the
6.dot
file.B. Make sure that the
dot
program is in your path.which dot
C. Use the full path to the
dot
program in your os.system command, see what happens then.如果您还使用 Python 生成 Dot 文件,pydot 会以更 Python 的方式执行您想要的操作方式:
If you also generate your Dot files in Python, pydot does what you want in a more Pythonic way:
通常解决方案就在我们面前,
您也可以尝试指定文件夹中的所有点
编辑:
我不记得顺便说一句,如果是
或
Often the solution is in front of us,
Also you can try for all the dots in a specified folder
Edit:
I cannot recall btw if it is
or
两个建议
把这个改成这个
然后
就好了。
编辑:请注意,我自己忘记从 PATH 变量中删除 /dot (哎呀) - PATH 是冒号分隔的目录列表。
Two suggestions
Change this
to this
Then your good.
EDIT: Note that I forgot to remove the /dot from the PATH variable myself (oops) - PATH is a colon delimited list of directories.
而不是:
试试这个:
如果点程序的退出状态为0,则打印状态。 如果 dot 返回非零状态,则会引发 CalledProcessError (并显示返回的状态)。 如果当前路径中不存在点,则在 Linux 上引发 OSError 或在 Windows 上引发 WindowsError (我不知道在 Mac OS 下引发哪个异常,但我假设 OSError)。
编辑:如果当前路径设置中没有 dot 可执行文件或 6.dot 文件,上面的代码会给您提示。
Instead of:
try this:
If exit status of dot program is 0, the status is printed. If dot returns non-zero status, it raises CalledProcessError (and shows returned status). If dot doesn't exist in current path, OSError is raised on Linux or WindowsErroor on Windows (I don't know which exception is raised under Mac OS, but I assume OSError).
EDIT: Code above will give you the hint if you have no dot executable or 6.dot file in current path settings.
check_call
不使用与os.system
相同的语法,因此您应该尝试以这种方式更改相应的行:可执行文件名称是数组中的第一项,并且每个参数必须位于数组的另一项中。 否则,您将总是收到“没有这样的文件”错误,因为您的路径中没有名为“dot -o9.png ...”的可执行文件。
check_call
does not use the same syntax asos.system
, so you should try changing the corresponding line this way:The executable name is the first item in the array, and each parameter must be in another item of the array. Otherwise you will always get a "No such file" error because there is no executable named "dot -o9.png ..." in your PATH.
这一行有一个问题:
您没有将可执行文件的名称放入路径中,而是将包含可执行文件的目录放入其中。 所以应该是:
正如另一条评论中指出的,
check_call
的参数与os.system
不同。One problem is in this line:
You don't put the name of the executable in the path, but the directory containing the executable. So that should be:
And as pointed out in another comment, the arguments to
check_call
are not the same asos.system
.如果您使用的是
Spyder
等 GUI,那么您只需将正确的 bin 路径添加到PYTHONPATH manager
选项菜单中即可。通过在终端中执行以下操作来搜索脚本位置:
然后获取该位置(无论它在哪里),减去程序名称,例如:
然后进入
PYTHONPATH manager
选项菜单并添加此路径。 然后重新启动Spyder就可以了。If you are using a GUI such as
Spyder
then you can simply add the correct bin path into thePYTHONPATH manager
options menu.Search for the script location by doing this in the terminal:
then take that location (wherever it is), subtract the programname, for example:
Then go into the
PYTHONPATH manager
options menu and add this path. Then restart Spyder and it'll work.