У меня есть скрипт с именем 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
Я знаю об одном методе, который открывает файл, читает содержимое и в основном оценивает его. Я предполагаю, что есть лучший способ сделать это. Или, по крайней мере, я на это надеюсь.
runpy.run_module
ответ ?!Ответы:
Обычный способ сделать это что-то вроде следующего.
test1.py
service.py
источник
test1.py
находится в каком-то далеком каталоге?import test1
Вservice.py
действительно выполнить весь скрипт (который только определяет ,some_func()
так как__name__ == '__main__'
будетFalse
в этом случае). Это звучит как все, что ОП хочет сделать. Этот ответ выходит за рамки этого, но определенно отвечает на вопрос, а затем и на некоторые.test1.py
не содержит определения функцииsome_func()
(а, например, просто несколько строк кодаprint("hello")
), то ваш код не будет работать. В этом конкретном примере это работает, потому что вы по сути импортируете внешнюю функцию, которую впоследствии вызываете.Это возможно в Python 2, используя
См. Документацию для обработки пространств имен, если это важно в вашем случае.
В Python 3 это возможно с помощью (благодаря @fantastory)
Тем не менее, вы должны рассмотреть возможность использования другого подхода; ваша идея (из того, что я вижу) не выглядит очень чистой.
источник
sys.argv
список.По-другому:
Файл test1.py:
Файл service.py:
Преимущество этого метода в том, что вам не нужно редактировать существующий скрипт Python, чтобы поместить весь его код в подпрограмму.
Документация: Python 2 , Python 3
источник
subprocess.call("./test1.py", shell=True)
чтобы заставить это работатьshell=True
если это необходимо.test1.py
должен быть исполняемым и иметь строку shebang (#!/usr/bin/env python
), и вы должны указать полный путь, или вам нужно предоставить исполняемый файл самостоятельно:call([sys.executable, os.path.join(get_script_dir(), 'test1.py')])
гдеget_script_dir()
определено здесь .subprocess.call(['python', 'test1.py'])
.Если вы хотите, чтобы test1.py оставался исполняемым с той же функциональностью, что и при вызове внутри service.py, сделайте что-то вроде:
test1.py
service.py
источник
Используя ОС вы можете совершать звонки прямо на ваш терминал. Если вы хотите быть еще более конкретным, вы можете объединить вашу входную строку с локальными переменными, т.е.
источник
os.system
следует избегать вызовов , вы можете сделать то же самое с любым классом отPopen, Call,
Вы не должны делать это. Вместо этого сделайте:
test1.py:
service.py
источник
Используйте
import test1
для 1-го использования - он выполнит скрипт. Для последующих вызовов обработайте скрипт как импортированный модуль и вызовитеreload(test1)
метод.Простая проверка
sys.modules
может использоваться для вызова соответствующего действия. Чтобы ссылаясь на имя сценария в виде строки ('test1'
), используйте ' импорт () встроенный.источник
reload
ушел в Python 3.if __name__ == "__main__":
Guard. Могут быть и другие, более тонкие различия. Не оставляйте произвольный код на глобальном уровне. Поместите это в функцию и вызовите ее после импорта, как предложено вместо этого в принятом ответеЯ предпочитаю насморк :
источник
Почему бы просто не импортировать test1? Каждый скрипт Python является модулем. Лучшим способом было бы иметь функцию, например, main / run в test1.py, импортировать test1 и запустить test1.main (). Или вы можете выполнить test1.py как подпроцесс.
источник
Как уже упоминалось,
runpy
это хороший способ запустить другие скрипты или модули из текущего скрипта.Между прочим, для трассировщика или отладчика это довольно распространено, и при таких обстоятельствах такие методы, как прямой импорт файла или запуск файла в подпроцессе, обычно не работают.
Это также требует внимания, чтобы использовать
exec
для запуска кода. Вы должны предоставить надлежащее,run_globals
чтобы избежать ошибки импорта или некоторых других проблем. Обратитесь кrunpy._run_code
подробностям.источник
Это пример с
subprocess
библиотекой:источник
Popen
если функции более высокого уровня действительно не могут делать то, что вы хотите. В этом случае,check_call
илиrun
будет делать все, что вам нужно, и больше, со значительно меньшими затратами в вашем собственном коде.Этот процесс несколько неортодоксален, но будет работать во всех версиях Python,
Предположим, что вы хотите выполнить сценарий с именем 'require.py' внутри условия 'if', затем используйте,
Техника другая, но работает!
источник