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

у меня есть скрипт с именем test1.py который не находится в модуле. Он просто имеет код, который должен выполняться при запуске самого скрипта. Нет никаких функций, классов, методов и т. д. У меня есть другой скрипт, который работает как служба. Я хочу позвонить test1.py из скрипт запущен как служба.

например:

файл 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

Я знаю об одном методе, который открывает файл, читая содержимое, и в основном ивала ING его. Я предполагаю, что есть лучший способ делать это. По крайней мере, я на это надеюсь.

8 ответов


обычный способ сделать это что-то вроде следующего.

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()

это возможно в Python 2 с помощью

execfile("test2.py")

посмотреть документация для обработки пространств имен, если это важно в вашем случае.

однако, вы должны рассмотреть возможность использования другого подхода; ваша идея (насколько я вижу) не очень чистый.


иначе:

файл test1.py:

print "test1.py"

файл service.py:

import subprocess

subprocess.call("test1.py", shell=True)

преимущество этого метода заключается в том, что вам не нужно редактировать существующий скрипт Python, чтобы поместить весь его код в подпрограмму.

документы: Python 2, Python 3


Если вы хотите 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

вы не должны делать этого. Вместо этого:

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()

использовать import test1 для 1-го использования-он выполнит скрипт. Для последующих вызовов обработайте скрипт как импортированный модуль и вызовите reload(test1) метод.

, когда reload(module) выполняется:

  • код модулей Python перекомпилируется и код уровня модуля перевыполняются, определение нового набора объектов, привязанных к именам в словаре модуля. Функция init модулей расширения не называется

простая проверка sys.modules может использоваться для вызова соответствующего действия. Чтобы сохранить ссылку на имя скрипта в виде строки ('test1'), используйте 'импорт()' builtin.

import sys
if sys.modules.has_key['test1']:
    reload(sys.modules['test1'])
else:
    __import__('test1')

import os

os.system("python myOtherScript.py arg1 arg2 arg3")  

С помощью ОС вы можете совершать звонки непосредственно на свой терминал. Если вы хотите быть еще более конкретным, вы можете объединить свою входную строку с локальными переменными, т. е.

command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)

Почему бы просто не импортировать test1? Каждый скрипт python-это модуль. Лучшим способом было бы иметь функцию, например main/run in test1.py, импортируйте test1 и запустите test1.главный.)( Или вы можете выполнить test1.py как подпроцесс.