Случается со мной при разработке моих проектов Laravel. В целях развития, это не biggie особенно, когда вы используете систему Windows. Но для производства я просто запускаю Linux и проблема решена. Также, если возможно, измените соединение MySQL с «localhost» на «127.0.0.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()
import os
os.system("python myOtherScript.py arg1 arg2 arg3")
Используя os, вы можете совершать звонки непосредственно на ваш терминал. Если вы хотите быть более конкретным, вы можете объединить строку ввода с локальными переменными, то есть
command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)
os.system
следует избегать, вы можете сделать то же самое с любым классом из Popen, Call,
– user1767754
5 January 2018 в 05:45
Используйте import test1
для первого использования - он выполнит сценарий. Для последующих вызовов обработайте скрипт как импортированный модуль и вызовите метод reload(test1)
.
Когда выполняется
reload(module)
:blockquote>
- Код модулей Python перекомпилирован, и код модуля-уровня повторно выполняется, определяя новый набор объектов, которые привязаны к именам в словаре модуля. Функция init модулей расширения не называется
Простую проверку
sys.modules
можно использовать для вызова соответствующего действия. Чтобы ссылаться на имя сценария в виде строки ('test1'
), используйте встроенный 'import ()' .import sys if sys.modules.has_key['test1']: reload(sys.modules['test1']) else: __import__('test1')
if __name__ == "__main__":
. Могут быть другие более тонкие различия. Не оставляйте произвольный код на глобальном уровне. Поместите его в функцию и вызовите его после импорта, как предложено в принятом ответе вместо
– jfs
13 January 2015 в 19:18
Это возможно в Python 2 с помощью
execfile("test2.py")
См. документацию для обработки пространств имен, если это важно в вашем случае.
, вам следует рассмотреть возможность использования другого подхода; ваша идея (из того, что я вижу) выглядит не очень чисто.
sys.argv
.
– jfs
13 January 2015 в 19:09
Если вы хотите, чтобы 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
Другой способ:
print "test1.py"
import subprocess
subprocess.call("test1.py", shell=True)
Преимущество этого метода заключается в том, что вам не нужно редактировать существующий скрипт Python, чтобы поместить весь его код в подпрограмму.
subprocess.call("./test1.py", shell=True)
, чтобы он работал
– asmaier
17 April 2013 в 10:45
test1.py
должен быть исполняемым и иметь строку shebang (#!/usr/bin/env python
), и вы должны указать полный путь или вам нужно предоставить исполняемый файл самостоятельно: call([sys.executable, os.path.join(get_script_dir(), 'test1.py')])
, где get_script_dir()
определен здесь .
– jfs
13 January 2015 в 19:14
Вы не должны этого делать. Вместо этого выполните:
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()
Почему бы не просто импортировать test1? Каждый скрипт python является модулем. Лучше было бы иметь функцию, например. main / run в test1.py, импортировать test1 и запустить test1.main (). Или вы можете выполнить test1.py в качестве подпроцесса.
test1.py
находится в каком-то отдаленном каталоге? – Evgeni Sergeev 8 June 2014 в 06:46main()
- которая не будет очень описательной (или точной) в этом случае. – martineau 13 January 2015 в 19:36