[英]How do I run “dot” as a command from 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
我沒有回答。
我怎樣才能找到點可執行文件?
或者,我可以將Python程序作為Python內部的命令運行嗎?
whereis
位於手冊頁, which
位於二進制文件。 所以試試which dot
。
您需要在Python環境中添加“dot”可執行文件的路徑。 您可以通過修改os.environ中的PATH變量來完成此操作
嘗試這個:
# -*- 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"])
從這個問題出發,嘗試在這里保持某種理智。
故障排除提示
A.添加
print os.getcwd()
在os.system之前的行(“dot等”
只是為了確保當前目錄是6.dot
文件的目錄。
B.確保dot
程序在您的路徑中。
which dot
C.在os.system命令中使用dot
程序的完整路徑,看看會發生什么。
兩個建議
改變這個
os.environ['PATH'] += ";"+"/usr/local/bin/dot"
對此
os.environ['PATH'] += ":"+"/usr/local/bin"
然后你的好。
編輯:請注意,我忘了從PATH變量中刪除/ dot(oops) - PATH是以冒號分隔的目錄列表。
如果你也用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')
通常解決方案在我們面前,
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
您應該更改PATH行,使其包含包含dot
的目錄。 該目錄是/usr/local/bin
,沒有/dot
。
代替:
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文件,上面的代碼將為您提供提示。
check_call
不使用與os.system
相同的語法,因此您應該嘗試以這種方式更改相應的行:
print check_call(["dot", "-o9.png", "-Tpng", "./6.dot"])
可執行文件名是數組中的第一項,每個參數必須位於數組的另一個項中。 否則,您將始終收到“No such file”錯誤,因為PATH中沒有名為“dot -o9.png ...”的可執行文件。
一個問題在於這一行:
os.environ['PATH'] += ":"+"/usr/local/bin/dot"
您不會將可執行文件的名稱放在路徑中,而是包含可執行文件的目錄。 那應該是:
os.environ['PATH'] += ":"+"/usr/local/bin"
正如另一條評論所指出的, check_call
的參數與check_call
os.system
。
如果您使用的是諸如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,它會工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.