2011-04-26 43 views

Respuesta

38

execfile ejecuta un archivo de Python, pero al cargarlo, no como una secuencia de comandos. Solo puede pasar enlaces de variable, no argumentos.

Si desea ejecutar un programa desde dentro de Python, use subprocess.call. P.ej.

subprocess.call(['./abc.py', arg1, arg2]) 
+4

El siguiente formato funciona para mí: 'subprocess.call (" python abc.py 'arg1' ", shell = True)' – geotheory

+0

@geotheory Claro que funciona, pero es menos seguro y se pone peludo cuando quieres pasar cuerdas con las cita en un subproceso. –

+2

¿Puedes explicar a qué te refieres con "cargarlo, no como un script"? ¿Cual es la diferencia? – marco

5

No puede pasar argumentos de línea de comandos con execfile(). Mira subprocess en su lugar.

+0

Consulte la respuesta de @ user2757262 más arriba. –

10

Está confundiendo la carga de un módulo en el proceso actual del intérprete y llamando a un script de Python externamente.

El primero se puede hacer por import ing el archivo que le interesa. execfile es similar a la importación pero simplemente evalúa el archivo en lugar de crear un módulo. Similar a "sourcing" en un script de shell.

Esto último se puede hacer utilizando el módulo de subproceso. Usted genera otra instancia del intérprete y pasa los parámetros que desee. Esto es similar a los bombardeos en un script de shell que usa palos de retroceso.

+0

Esto tiene sentido, pero se apreciará algún código de muestra. – anon58192932

22
import sys 
import subprocess 

subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2']) 
49

probar esto:

import sys 
sys.argv = ['arg1', 'arg2'] 
execfile('abc.py') 

Tenga en cuenta que cuando abc.py acabados, control serán devueltos al programa de llamada. Tenga en cuenta también que abc.py puede llamar al quit() si realmente terminó.

+0

funcionaba como un amuleto –

+0

Por lo que yo sé, no se está transmitiendo nada a 'abc.py', ni puedo ver por qué debería hacerlo. – geotheory

+4

Cuando mi 'abc.py' tiene 'argparse' para analizar los argumentos de entrada, recibí un error con este método: muy pocos argumentos. Ejecuté 'python abc.py arg1 arg2' en la terminal (este método funciona sin error) y luego imprimí el contenido de' sys.argv' al imprimir y encontré que 'sys.argv' contiene el nombre' 'abc.py' 'como el primer elemento de la lista. En realidad, ** el código de usuario2757262 a continuación ** con 'sys.argv = ['abc.py', 'arg1', 'arg2']' ¡fue el que funcionó! –

34

En realidad, ¿no nos gustaría hacer esto?

import sys 
sys.argv = ['abc.py','arg1', 'arg2'] 
execfile('abc.py') 
+2

¡Excelente, este funcionó muy bien! Gracias. –

+0

... y luego, resulta que 'python' apunta a una versión diferente (2-vs-3) de Python :) – mlvljr

+0

Tengo que rechazar la respuesta de buggywhip porque perdió esta sutileza. – philologon

2

Para los escenarios más interesantes, también se puede mirar en el módulo runpy. Desde python 2.7, tiene la función run_path. Por ejemplo:

import runpy 
import sys 

# argv[0] will be replaced by runpy 
# You could also skip this if you get sys.argv populated 
# via other means 
sys.argv = ['', 'arg1' 'arg2'] 
runpy.run_path('./abc.py', run_name='__main__') 
0

Además subprocess.call, también se puede utilizar subprocess.Popen. Al igual que el siguiente

subprocess.Popen(['./script', arg1, arg2])

0

Si establece PYTHONINSPECT en el archivo de pitón que desea ejecutar

[repl.py]

import os 
import sys 
from time import time 
os.environ['PYTHONINSPECT'] = 'True' 
t=time() 
argv=sys.argv[1:len(sys.argv)] 

no hay necesidad de utilizar execfile, y usted puede ejecutar directamente el archivo con argumentos como de costumbre en el shell:

python repl.py one two 3 
>>> t 
1513989378.880822 
>>> argv 
['one', 'two', '3'] 
0

Si desea ejecutar las secuencias de comandos en paralelo y darles diferentes argumentos, puede hacer lo siguiente.

import os 
os.system("python script.py arg1 arg2 & python script.py arg11 arg22") 
Cuestiones relacionadas