Я хотел бы запустить команду в Python Shell для выполнения файла с аргументом.
Например: execfile("abc.py")
, но как добавить 2 аргумента?
Я хотел бы запустить команду в Python Shell для выполнения файла с аргументом.
Например: execfile("abc.py")
, но как добавить 2 аргумента?
execfile
запускает файл Python, но загружая его, а не как script. Вы можете передавать только переменные привязки, а не аргументы.
Если вы хотите запустить программу из Python, используйте subprocess.call
. Например.
subprocess.call(['./abc.py', arg1, arg2])
попробуйте следующее:
import sys
sys.argv = ['arg1', 'arg2']
execfile('abc.py')
Обратите внимание, что при завершении abc.py
управление будет возвращено вызывающей программе. Также обратите внимание, что abc.py
может вызвать quit()
, если он действительно закончен.
Собственно, не хотим ли мы этого сделать?
import sys
sys.argv = ['abc.py','arg1', 'arg2']
execfile('abc.py')
import sys
import subprocess
subprocess.call([sys.executable, 'abc.py', 'argument1', 'argument2'])
Вы запутываете загрузку модуля в текущий процесс интерпретатора и вызывают Python script извне.
Первый может быть сделан import
с интересующим вас файлом. execfile похож на импорт, но он просто оценивает файл, а не создает из него модуль. Аналогично "sourcing" в оболочке script.
Последнее может быть выполнено с использованием модуля подпроцесса. Вы создаете другой экземпляр интерпретатора и передаете все параметры, которые вы хотите. Это похоже на обход в оболочке script с использованием обратных ссылок.
Вы не можете передавать аргументы командной строки с помощью execfile()
. Посмотрите subprocess
.
Для более интересных сценариев вы также можете посмотреть модуль runpy
. Начиная с python 2.7, он имеет функцию run_path
. Например:
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__')
Помимо subprocess.call
, вы также можете использовать subprocess.Popen
. Как показано ниже
subprocess.Popen(['./script', arg1, arg2])
Если вы установили PYTHONINSPECT
в файле python, который вы хотите выполнить
[repl.py]
import os
import sys
from time import time
os.environ['PYTHONINSPECT'] = 'True'
t=time()
argv=sys.argv[1:len(sys.argv)]
нет необходимости использовать execfile
, и вы можете напрямую запускать файл с аргументами, как обычно, в оболочке:
python repl.py one two 3
>>> t
1513989378.880822
>>> argv
['one', 'two', '3']