문제

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

두 가지 제안

  1. 경로를 사용하지 말고 대신 실행 파일을 찾으려면 대신 사용하십시오.
  2. 당신은 사용하지 않습니다 ";" (세미 콜론) 경로를 분리하지만 ":"(콜론). 이것을 변경하면 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 옵션 메뉴를 하고이 경로를 추가하십시오. 그런 다음 스파이더를 다시 시작하면 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top