Как запустить «точку» как команду из Python? - PullRequest
4 голосов
/ 05 июня 2009

Я использую Python на Mac OSX Leopard.

Я пытаюсь запустить программу 'dot' (часть Graphviz) из 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")

Команда "ls" существует только для того, чтобы убедиться, что python находится в правильном каталоге. Это. Результат, который я получаю:

/ USR / бен: / бен: / USR / SBIN: / SBIN 0 32512

Насколько я понимаю, ошибка 32512 означает, что python не может найти файл, и, поскольку файл 6.dot существует (если я запускаю "dot -o9.png -Tpng ./6.dot" из терминала, который я получаю ошибки нет, и создается 9.png), я предполагаю, что Python не может найти файл точек.

Мне, вероятно, нужно добавить файл точки в путь. Но я не знаю, где это. Если я бегу:

whereis dot

Я не получил ответа.

Как мне найти исполняемый файл dot?
Или я могу запустить программу dot как команду из Python?

Ответы [ 12 ]

10 голосов
/ 05 июня 2009

whereis находит справочные страницы, which находит двоичные файлы. Так что попробуйте which dot.

3 голосов
/ 05 июня 2009

Попробуйте это:

# -*- 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"])

Взято из вопроса, чтобы попытаться сохранить здесь какое-то здравомыслие.

3 голосов
/ 05 июня 2009

Вам необходимо добавить путь к исполняемому файлу 'dot' в среде Python. Вы можете сделать это, изменив переменную PATH в os.environ

2 голосов
/ 05 июня 2009

Вам следует изменить строку PATH, чтобы она включала каталог, содержащий dot. Этот каталог /usr/local/bin, без /dot.

2 голосов
/ 05 июня 2009

Часто решение находится перед нами,

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)

Edit:

Я не могу вспомнить, кстати, если это

/usr/local/bin/dot -o9.png -Tpng fdot.dot

или

/usr/local/bin/dot -o 9.png -Tpng fdot.dot
2 голосов
/ 05 июня 2009

Если вы также генерируете свои файлы Dot на Python, 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')
2 голосов
/ 05 июня 2009

Два предложения

  1. Не используйте PATH, вместо этого используйте "which", чтобы просто найти исполняемый файл вместо
  2. Вы не используете ";" (точка с запятой) для разделения путей, но ":" (двоеточие). Как только вы измените это, он сможет найти вашу точечную программу.

Изменить это

os.environ['PATH'] += ";"+"/usr/local/bin/dot"

к этому

os.environ['PATH'] += ":"+"/usr/local/bin"

Тогда тебе хорошо.

РЕДАКТИРОВАТЬ: Обратите внимание, что я забыл удалить / точка из переменной PATH самостоятельно (упс)

2 голосов
/ 05 июня 2009

Советы по устранению неполадок:

A. добавить

print os.getcwd()

в строке перед os.system («точка и т. Д.»

Просто чтобы убедиться, что текущим каталогом является файл 6.dot.

B. Убедитесь, что программа dot находится на вашем пути.

which dot

C. Используйте полный путь к программе dot в вашей команде os.system, посмотрите, что будет потом.

1 голос
/ 05 июня 2009

Одна проблема в этой строке:

os.environ['PATH'] += ":"+"/usr/local/bin/dot"

Вы не помещаете имя исполняемого файла в путь, а каталог, содержащий исполняемый файл. Так должно быть:

os.environ['PATH'] += ":"+"/usr/local/bin"

И, как указано в другом комментарии, аргументы check_call не совпадают с os.system.

1 голос
/ 05 июня 2009

check_call не использует тот же синтаксис, что и os.system, поэтому вам следует попробовать изменить соответствующую строку следующим образом:

print check_call(["dot", "-o9.png", "-Tpng", "./6.dot"])

Имя исполняемого файла является первым элементом в массиве, и каждый параметр должен быть в другом элементе массива. В противном случае вы всегда получите ошибку «Нет такого файла», потому что в вашем PATH нет исполняемого файла с именем «dot -o9.png ...».

...