Python의 명령으로 "dot"을 어떻게 실행합니까?
문제
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 오류가 파일을 찾을 수 없다는 것을 의미하며, 파일 6.DOT가 있으므로 (내가 실행하는 경우 ( "dot -o9.png -tpng ./6.dot"에서 터미널에서 실행하면 오류가 발생하지 않습니다. 그리고 9.png가 생산됩니다), Python은 DOT 파일을 찾을 수 없다고 가정합니다.
아마도 경로에 도트 파일을 추가해야 할 것입니다. 그러나 나는 그것이 어디에 있는지 모른다. 내가 달리면 :
whereis dot
나는 대답을받지 않습니다.
도트 실행 파일을 어떻게 찾을 수 있습니까?
또는 DOT 프로그램을 내부 파이썬에서 명령으로 실행할 수 있습니까?
해결책
경로 선을 변경하여 포함하는 디렉토리가 포함되어야합니다. dot
. 그 디렉토리입니다 /usr/local/bin
, 없이 /dot
.
다른 팁
whereis
남자 페이지를 찾아 which
바이너리를 찾습니다. 그래서 시도하십시오 which dot
.
파이썬 환경에서 '도트'실행 파일로의 경로를 추가해야합니다. os.environ에서 경로 변수를 수정하여이를 수행 할 수 있습니다.
이 시도:
# -*- 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 앞의 라인 ( "점 등
현재 디렉토리가 6.dot
파일.
B. dot
프로그램이 당신의 길에 있습니다.
which dot
C. 전체 경로를 사용하십시오 dot
OS.System 명령에서 프로그램을 프로그램하고 어떤 일이 발생하는지 확인하십시오.
파이썬에서 도트 파일을 생성하는 경우 pydot 더 피스닉적인 방식으로 원하는 것은 다음과 같습니다.
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)
편집하다:
BTW를 기억할 수 없습니다
/usr/local/bin/dot -o9.png -Tpng fdot.dot
또는
/usr/local/bin/dot -o 9.png -Tpng fdot.dot
두 가지 제안
- 경로를 사용하지 말고 대신 실행 파일을 찾으려면 대신 사용하십시오.
- 당신은 사용하지 않습니다 ";" (세미 콜론) 경로를 분리하지만 ":"(콜론). 이것을 변경하면 DOT 프로그램을 찾을 수 있어야합니다.
이것을 바꾸십시오
os.environ['PATH'] += ";"+"/usr/local/bin/dot"
이에
os.environ['PATH'] += ":"+"/usr/local/bin"
그럼 당신의 선.
편집 : 경로 변수 직접 /도트를 제거하는 것을 잊어 버렸습니다 (oops) - 경로는 콜론 구분 된 디렉토리 목록입니다.
대신에:
print os.system("dot -o9.png -Tpng ./6.dot")
이 시도:
from subprocess import check_call
print check_call("dot -o9.png -Tpng ./6.dot")
DOT 프로그램의 종료 상태가 0이면 상태가 인쇄됩니다. DOT가 0이 아닌 상태를 반환하면 ProcessError라는 호출이 발생하고 반환 된 상태를 표시합니다. 현재 경로에 DOT가 존재하지 않으면 Windows에서 Linux 또는 Wind
편집 : 위의 코드는 현재 경로 설정에 도트 실행 가능 또는 6.dot 파일이없는 경우 힌트를 제공합니다.
check_call
동일한 구문을 사용하지 않습니다 os.system
, 따라서 해당 라인을 이런 방식으로 변경해야합니다.
print check_call(["dot", "-o9.png", "-Tpng", "./6.dot"])
실행 가능 이름은 배열의 첫 번째 항목이며 각 매개 변수는 배열의 다른 항목에 있어야합니다. 그렇지 않으면 당신은 할 것입니다 언제나 경로에 "dot -o9.png ..."라는 실행 가능이 없기 때문에 "그러한 파일 없음"오류를 받으십시오.
한 가지 문제는이 줄에 있습니다.
os.environ['PATH'] += ":"+"/usr/local/bin/dot"
실행 파일의 이름을 경로에 넣지 않고 실행 파일이 포함 된 디렉토리를 넣습니다. 그래서 그것은 다음과 같아야합니다.
os.environ['PATH'] += ":"+"/usr/local/bin"
그리고 다른 의견에서 지적한 바와 같이, 논쟁은 check_call
동일하지 않습니다 os.system
.
다음과 같은 GUI를 사용하는 경우 Spyder
그런 다음 단순히 올바른 빈 경로를 추가 할 수 있습니다. 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
옵션 메뉴를 하고이 경로를 추가하십시오. 그런 다음 스파이더를 다시 시작하면 작동합니다.