Me gustaría ejecutar un comando en Python Shell para ejecutar un archivo con un argumento.Ejecutar un archivo con argumentos en el shell de Python
Por ejemplo: execfile("abc.py")
pero ¿cómo agregar 2 argumentos?
Me gustaría ejecutar un comando en Python Shell para ejecutar un archivo con un argumento.Ejecutar un archivo con argumentos en el shell de Python
Por ejemplo: execfile("abc.py")
pero ¿cómo agregar 2 argumentos?
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])
El siguiente formato funciona para mí: 'subprocess.call (" python abc.py 'arg1' ", shell = True)' – geotheory
@geotheory Claro que funciona, pero es menos seguro y se pone peludo cuando quieres pasar cuerdas con las cita en un subproceso. –
¿Puedes explicar a qué te refieres con "cargarlo, no como un script"? ¿Cual es la diferencia? – marco
No puede pasar argumentos de línea de comandos con execfile()
. Mira subprocess
en su lugar.
Consulte la respuesta de @ user2757262 más arriba. –
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.
Esto tiene sentido, pero se apreciará algún código de muestra. – anon58192932
import sys
import subprocess
subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2'])
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ó.
funcionaba como un amuleto –
Por lo que yo sé, no se está transmitiendo nada a 'abc.py', ni puedo ver por qué debería hacerlo. – geotheory
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ó! –
En realidad, ¿no nos gustaría hacer esto?
import sys
sys.argv = ['abc.py','arg1', 'arg2']
execfile('abc.py')
¡Excelente, este funcionó muy bien! Gracias. –
... y luego, resulta que 'python' apunta a una versión diferente (2-vs-3) de Python :) – mlvljr
Tengo que rechazar la respuesta de buggywhip porque perdió esta sutileza. – philologon
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__')
Además subprocess.call
, también se puede utilizar subprocess.Popen
. Al igual que el siguiente
subprocess.Popen(['./script', arg1, arg2])
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']
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")
¿Cómo es el código en el archivo que desea ejecutar recuperar los argumentos? – martineau