Как лучше всего вызвать скрипт из другого скрипта?

У меня есть 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)