Uso de una llamada de subproceso de Python para invocar un script de Python

Tengo un script de Python que necesita invocar otro script de Python en el mismo directorio. Hice esto:

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

Obtuve 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 such file or directory 

Aunque tengo el script somescript.py en la misma carpeta. ¿Me estoy perdiendo de algo?

Si ‘somescript.py’ no es algo que normalmente podría ejecutar directamente desde la línea de comandos (es decir, $: somescript.py funciona), entonces no puede llamarlo directamente usando call.

Recuerde que la forma en que funciona Popen es que el primer argumento es el progtwig que ejecuta, y el rest son los argumentos que se pasan a ese progtwig. En este caso, el progtwig es en realidad Python , no su script. Así que lo siguiente funcionará como esperas:

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

Esto llama correctamente al intérprete de Python y le dice que ejecute su script con los argumentos dados.

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

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

Eso intentará ejecutar el progtwig llamado python somscript.py , que claramente no existe.

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

También funcionará, pero el uso de cadenas como entrada para llamar no es multiplataforma, es peligroso si usted no es el que construye la cadena y, por lo general, debe evitarse si es posible.

Windows? Unix?

Unix necesitará un atributo shebang y exec para funcionar:

 #!/usr/bin/env python 

Como 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 se mencionó previamente.

Windows debería funcionar si agrega el parámetro shell = True a la llamada “call”.

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) 

subprocess.call espera los mismos argumentos que subprocess.Popen : 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”, …

Si estás en Linux / Unix, podrías evitar call () por completo 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) 

Por lo que vale.

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 envuelva la funcionalidad en una función, por ejemplo, baz, luego haga 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 muchos scripts que inician procesos de Python o se bifurcan, ¿es eso un requisito?

Primero, verifique si somescript.py es ejecutable y comienza con algo como las líneas #!/usr/bin/python . Si se hace esto, entonces puede usar subprocess.call('./somescript.py') .

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

 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 

La llamada de subproceso es una llamada de sistema muy literal. puede utilizarse para cualquier proceso genérico … por lo tanto, no sabe qué hacer con un script de Python automáticamente.

Tratar

 call ('python somescript.py') 

Si eso no funciona, es posible que desee probar una ruta absoluta y / o verificar los permisos en su secuencia de comandos de Python … las cosas divertidas típicas.