Как лучше всего вызвать скрипт из другого скрипта?
У меня есть script с именем test1.py, который не находится в модуле. Он просто имеет код, который должен выполняться при запуске script. Нет функций, классов, методов и т.д. У меня есть еще один script, который работает как служба. Я хочу вызвать test1.py из script в качестве службы.
Например:
Файл test1.py
print "I am a test"
print "see! I do nothing productive."
Файл service.py
# Lots of stuff here
test1.py # do whatever is in test1.py
Я знаю один метод, который открывает файл, читает содержимое и в основном его оценивает. Я предполагаю, что это лучший способ сделать это. Или, по крайней мере, я надеюсь.
Ответы
Ответ 1
Обычный способ сделать это примерно так:
test1.py
def some_func():
print 'in test 1, unproductive'
if __name__ == '__main__':
# test1.py executed as script
# do something
some_func()
service.py
import test1
def service_func():
print 'service func'
if __name__ == '__main__':
# service.py executed as script
# do something
service_func()
test1.some_func()
Ответ 2
Это возможно в Python 2, используя
execfile("test2.py")
См. Документацию для обработки пространств имен, если это важно в вашем случае.
В Python 3 это возможно с помощью (благодаря @fantastory)
exec(open("test2.py").read());
Тем не менее, вы должны рассмотреть возможность использования другого подхода; ваша идея (из того, что я вижу) не выглядит очень чистой.
Ответ 3
Другой способ:
Файл test1.py:
print "test1.py"
Файл service.py:
import subprocess
subprocess.call("test1.py", shell=True)
Преимущество этого метода в том, что вам не нужно редактировать существующий Python script, чтобы поместить весь его код в подпрограмму.
Документация: Python 2, Python 3
Ответ 4
Если вы хотите, чтобы test1.py оставался исполняемым с той же функциональностью, что и при вызове внутри service.py, выполните следующее:
test1.py
def main():
print "I am a test"
print "see! I do nothing productive."
if __name__ == "__main__":
main()
service.py
import test1
# lots of stuff here
test1.main() # do whatever is in test1.py
Ответ 5
Вы не должны этого делать. Вместо этого выполните:
test1.py:
def print_test():
print "I am a test"
print "see! I do nothing productive."
service.py
#near the top
from test1 import print_test
#lots of stuff here
print_test()
Ответ 6
Используйте import test1
для первого использования - он выполнит script. Для последующих вызовов обработайте script как импортированный модуль и вызовите метод reload(test1)
.
Когда выполняется reload(module)
:
- Код модулей Python перекомпилируется, а код модуля-уровня повторно выполняется, определяя новый набор объектов, привязанных к именам в словаре модулей. Функция init модулей расширения не называется
Простая проверка sys.modules
может использоваться для вызова соответствующего действия. Чтобы ссылаться на имя script как строку ('test1'
), используйте ' import()' встроенный.
import sys
if sys.modules.has_key['test1']:
reload(sys.modules['test1'])
else:
__import__('test1')
Ответ 7
import os
os.system("python myOtherScript.py arg1 arg2 arg3")
Используя os, вы можете совершать звонки непосредственно на ваш терминал. Если вы хотите быть более конкретным, вы можете объединить строку ввода с локальными переменными, т.е.
command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)
Ответ 8
Почему бы просто не импортировать test1? Каждый скрипт Python является модулем. Лучшим способом было бы иметь функцию, например, main/run в test1.py, импортировать test1 и запустить test1.main(). Или вы можете выполнить test1.py как подпроцесс.
Ответ 9
Вот пример с библиотекой subprocess
:
import subprocess
python_version = '3'
path_to_run = './'
py_name = '__main__.py'
# args = [f"python{python_version}", f"{path_to_run}{py_name}"] # Avaible in python3
args = ["python{}".format(python_version), "{}{}".format(path_to_run, py_name)]
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
print(output)
else:
print(error_)
Ответ 10
Я нашел этот простой пример на http://hplgit.github.io/primer.html/doc/pub/tech/._tech-solarized012.html для вызова одного скрипта Python из другого, даже если вам нужно указать несколько аргументов
import subprocess
cmd = 'python train_frcnn.py --input_weight_path model_frcnn.hdf5 -o simple -p take2.csv'
subprocess.call(cmd, shell=True)