簡體   English   中英

如何從Python運行“dot”作為命令?

[英]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程序的完整路徑,看看會發生什么。

兩個建議

  1. 不要使用PATH,而是使用“which”來代替只找到可執行文件
  2. 你不要用“;” (分號)分隔路徑,但是“:”(冒號)。 一旦你改變它,它應該能夠找到你的點程序。

改變這個

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM