2011-08-22 8 views
15

Tengo un script de python que necesita invocar otro script de python en el mismo directorio. Hice esto:usando python llamada de subproceso para invocar el script de python

from subprocess import call 
    call('somescript.py') 

me sale el siguiente error

call('somescript.py') 
    File "/usr/lib/python2.6/subprocess.py", line 480, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 633, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child 
raise child_exception 

OSError: [Errno 2] No existe el fichero o directorio

que tienen la secuencia de comandos somescript.py en la misma carpeta aunque. Me estoy perdiendo de algo. Gracias

+1

¿Está '.' en su' PATH'? ¿Es somescript.py ejecutable? – geoffspear

+1

¿Por qué intentas ejecutarlo? ¿por qué no 'importar'? – tMC

+0

@wooble sí. Está en el camino yy ejecutable también. Sí. También podría importarlo. Pero me gustaría saber lo que estoy haciendo mal aquí, ya que creo que se supone que funciona. – user514946

Respuesta

1

subprocess.call espera los mismos argumentos que subprocess.Popen - que es una lista de cadenas (el argv en c) en lugar de una sola cadena. Es muy posible que el proceso de su hijo haya intentado ejecutar "s" con los parámetros "o", "m", "e" ...

0

llamada de subproceso es una llamada al sistema muy literal. se puede usar para cualquier proceso genérico ... por lo tanto, no sabe qué hacer automáticamente con un script de python.

tratar

call ('python somescript.py') 

si eso no funciona, es posible que desee probar una ruta absoluta, y/o permisos de verificación en su pitón guión ... las cosas típicas divertido.

j

0

En primer lugar, comprobar si somescript.py es ejecutable y empieza con algo en la línea de #!/usr/bin/python. Si esto se hace, entonces puede usar subprocess.call('./somescript.py').

O como otra respuesta señala, puede hacer subprocess.call(['python', 'somescript.py']).

+0

Solo un puntero al azar: he encontrado que es útil utilizar #!/Usr/bin/env python para que, si se ha cargado un módulo, se ejecute automáticamente con la versión de python cargada. – Vorticity

5

Windows? Unix?

Unix necesitará un tinglado y el atributo exec para trabajar:

#!/usr/bin/env python 

como la primera línea de guión y:

chmod u+x script.py 

en la línea de comandos o

call('python script.py'.split()) 

como previamente mencionado.

Windows debería funcionar si agrega el shell=True parameter a la llamada "call".

+5

'call ('python script.py')' no funcionará en sistemas que no sean de Windows. Debería ser 'check_call ([sys.executable o 'python', '/path/to/script.py'])'. Y no necesita los permisos shebang y ejecutables si se especifica el ejecutable 'python'. – jfs

+0

sys.executable debería ser suficiente para todas las situaciones. –

2

si está en Linux/Unix puede evitar call() y no ejecutar una instancia completamente nueva del ejecutable de Python y su entorno.

import os 

cpid = os.fork() 
if not cpid: 
    import somescript 
    os._exit(0) 

os.waitpid(cpid, 0) 

Fwiw

+1

Solo * nix: utilizando fork heredará del intérprete de python del proceso principal (con todas las importaciones existentes, ...). Si quieres un nuevo intérprete, esta no es una buena opción. Ver la llamada del sistema diff fork/exec unix. –

+0

El módulo 'subprocess' utiliza' fork/exec' en sistemas POSIX y 'CreateProcess' en Windows. No es necesario utilizar 'fork' directamente si desea ejecutar un script de Python. – jfs

17

Si 'somescript.py' no es algo que normalmente podría ejecutar directamente desde la línea de comandos (es decir $: somescript.py obras), entonces no se pueden llamar directamente mediante una llamada.

Recuerda que la manera en que funciona Popen es que el primer argumento es el programa que ejecuta y el resto son los argumentos que se pasan a ese programa. En este caso, el programa es realmente python, no su script. Por lo que el siguiente trabajo como se esperaba:

subprocess.call(['python', 'somescript.py', somescript_arg1, somescript_val1,...]). 

Para esto se necesitan correctamente el intérprete de Python y le dice que para ejecutar la secuencia de comandos con los argumentos dados.

Tenga en cuenta que esto es diferente de la sugerencia anterior:

subprocess.call(['python somescript.py']) 

que tratará de ejecutar el programa llamado pitón somscript.py, lo que claramente no existe.

call('python somescript.py', shell=True) 

también funciona, pero el uso de cadenas como entrada a la llamada no es multiplataforma, es peligroso si no está la construcción de la cadena, y por lo general se debe evitar si es posible.

+0

Tengo este problema, pero la ruta al script está en mi archivo basrc, así que puedo llamarlo desde el terminal como myscript (args). Cuando trato de hacer lo anterior de python, me sale un error no encontrado? – rankind

0
def main(argv): 
    host = argv[0] 
    type = argv[1] 
    val = argv[2] 

    ping = subprocess.Popen(['python ftp.py %s %s %s'%(host,type,val)],stdout = subprocess.PIPE,stderr = subprocess.PIPE,shell=True) 
    out = ping.communicate()[0] 
    output = str(out) 
    print output 
2

Mira esto.

from subprocess import call 
with open('directory_of_logfile/logfile.txt', 'w') as f: 
    call(['python', 'directory_of_called_python_file/called_python_file.py'], stdout=f) 
1

¿Qué hay de malo en

import sys 
from os.path import dirname, abspath 

local_dir = abspath(dirname(__file__)) 
sys.path.append(local_dir) 

import somescript 

o mejor aún envolver la funcionalidad en una función, por ejemplo, baz, entonces haz esto.

import sys 
from os.path import dirname, abspath 

local_dir = abspath(dirname(__file__)) 
sys.path.append(local_dir) 

import somescript 
somescript.baz() 

Parece que hay una gran cantidad de secuencias de comandos de comenzar los procesos de Python o se bifurcan, es que un requisito?

Cuestiones relacionadas