Pregunta

Estoy usando Python en Mac OS X Leopard.

Estoy tratando de ejecutar el 'punto' (parte de Graphviz) programa de 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")

El comando "ls" está allí sólo para asegurarse de que Python está en el directorio correcto. Está. El resultado que consigo es:

  

/ usr / bin: / bin: / usr / sbin: / sbin   0   32512

Mi entendimiento es que significa 32512 error que pitón no pudo encontrar el archivo, y puesto que el archivo está allí 6.dot (Si me quedo "punto -o9.png -Tpng ./6.dot" de la terminal de recibo ningún error, y 9.png consigue producen), supongo que Python no puede encontrar el archivo de puntos.

Me probablemente necesitará añadir el archivo de puntos de la trayectoria. Pero no sé dónde está. Si me quedo:

whereis dot

recibo ninguna respuesta.

¿Cómo puedo encontrar el ejecutable de puntos?
Alternativamente, puedo ejecutar el programa de puntos como orden del interior Python?

¿Fue útil?

Solución

Debe cambiar la línea PATH para que incluya el directorio que contiene dot. Ese directorio es /usr/local/bin, sin /dot.

Otros consejos

whereis localiza páginas man, which localiza binarios. Así que trate de which dot.

Es necesario añadir la ruta al ejecutable 'punto' en el entorno de Python. Esto se puede hacer mediante la modificación de la variable PATH en os.environ

Prueba esto:

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

Tomado de la cuestión para tratar de mantener algún tipo de cordura aquí.

Consejos para solucionar problemas:

A. añadir

print os.getcwd()

en la línea antes os.system ( "dot etc.

Sólo para asegurarse de que el directorio actual es el que tiene el archivo 6.dot.

B. Asegúrese de que el programa dot se encuentra en su camino.

which dot

C. Utilice la ruta completa al programa dot en su comando os.system, ver lo que sucede a continuación.

Si también generar los archivos de puntos en Python, pydot hace lo que quiere en una forma más 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')

A menudo, la solución está en frente de nosotros,

print os.system("/usr/local/bin/dot -o9.png -Tpng 6.dot")

También puede probar para todos los puntos en una carpeta especificada

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)

Editar:

No puedo recordar por cierto si es

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

o

/usr/local/bin/dot -o 9.png -Tpng fdot.dot

Dos sugerencias

  1. No utilice PATH, en lugar de utilizar "que" a acaba de encontrar el ejecutable en lugar
  2. No se utiliza ";" (Semi-colon) a caminos separados, pero ":" (colon). Una vez que se cambie este debería ser capaz de encontrar su programa de puntos.

Cambiar esto

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

a este

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

A continuación, su buena.

EDIT: Tenga en cuenta que se me olvidó quitar el / punto de la variable PATH mismo (vaya) - PATH es una lista de colon delimitado de directorios

.

En lugar de:

print os.system("dot -o9.png -Tpng ./6.dot")

intente lo siguiente:

from subprocess import check_call
print check_call("dot -o9.png -Tpng ./6.dot")

Si el código de salida del programa de puntos es 0, se imprime el estado. Si vuelve punto distinto de cero estado, se plantea CalledProcessError (y devolvió el código de muestra). Si punto no existe en el camino actual, OSError se eleva en Linux o en Windows WindowsErroor (no sé qué excepción se levantó en Mac OS, pero supongo OSError).

EDIT: Código anterior le dará la pista si usted no tiene ningún punto ejecutable o archivo 6.dot en la configuración de circuito de corriente

.

check_call no utiliza la misma sintaxis que os.system, por lo que debe tratar de cambiar la línea correspondiente de esta manera:

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

El nombre ejecutable es el primer elemento de la matriz, y cada parámetro debe ser en otro elemento de la matriz. De lo contrario se siempre recibe un "No existe el fichero" error porque no hay un ejecutable llamado "punto -o9.png ..." en su camino.

Uno de los problemas es en esta línea:

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

No pones el nombre del ejecutable en el camino, pero el directorio que contiene el ejecutable. Por lo que debe ser:

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

Y como se ha señalado en otro comentario, los argumentos a check_call no son los mismos que os.system.

Si está utilizando una interfaz gráfica de usuario, tales como Spyder, entonces puede simplemente añadir la ruta bin correcto en el menú de opciones PYTHONPATH manager.

Búsqueda de la ubicación del script al hacer esto en el terminal:

which programname

luego tomar esa ubicación (donde sea), restar el ProgramName, por ejemplo:

/home/username/seiscomp3/bin/scart
#this is the section of the path that you use
/home/username/seiscomp3/bin

A continuación, entrar en el menú de opciones PYTHONPATH manager y añadir este camino. A continuación, reinicie Spyder y que va a trabajar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top