Как лучше всего вызвать сценарий из другого сценария?
у меня есть скрипт с именем 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, чтобы поместить весь его код в подпрограмму.
Если вы хотите 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 как подпроцесс.