Python rest api с использованием колбы для открытия другого сайта [дубликат]

Случается со мной при разработке моих проектов Laravel. В целях развития, это не biggie особенно, когда вы используете систему Windows. Но для производства я просто запускаю Linux и проблема решена. Также, если возможно, измените соединение MySQL с «localhost» на «127.0.0.1».

207
задан martineau 16 November 2016 в 05:27
поделиться

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()
212
ответ дан ars 16 August 2018 в 02:19
поделиться
  • 1
    Что, если test1.py находится в каком-то отдаленном каталоге? – Evgeni Sergeev 8 June 2014 в 06:46
  • 2
    @EvgeniSergeev См. stackoverflow.com/questions/67631/… – Evgeni Sergeev 8 June 2014 в 07:27
  • 3
    Почему вы назвали его «some_func ()» вместо «main ()»? – Marco Sulla 14 August 2014 в 13:49
  • 4
    @LucasMalor: Предположительно, потому что обычно предполагается not функция main() - которая не будет очень описательной (или точной) в этом случае. – martineau 13 January 2015 в 19:36
  • 5
    Это на самом деле не отвечает на вопрос, не так ли? Вы не выполняете весь скрипт, вы выполняете некоторые функции из импортируемого сценария. – gented 22 March 2017 в 11:36
import os

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

Используя os, вы можете совершать звонки непосредственно на ваш терминал. Если вы хотите быть более конкретным, вы можете объединить строку ввода с локальными переменными, то есть

command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)
5
ответ дан Alex Mapley 16 August 2018 в 02:19
поделиться
  • 1
    звонки в os.system следует избегать, вы можете сделать то же самое с любым классом из Popen, Call, – user1767754 5 January 2018 в 05:45
  • 2
    Из документации Python : модуль подпроцесса предоставляет более мощные средства для нереста новых процессов и получения их результатов; использование этого модуля предпочтительнее использования этой функции. – David Kennedy 6 March 2018 в 16:48

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

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

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

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

import sys
if sys.modules.has_key['test1']:
    reload(sys.modules['test1'])
else:
    __import__('test1')
7
ответ дан gimel 16 August 2018 в 02:19
поделиться
  • 1
    reload отсутствует в Python 3. – Piotr Dobrogost 3 November 2013 в 12:59
  • 2
    Импорт модуля не эквивалентен его запуску, например, рассмотрите функцию if __name__ == "__main__":. Могут быть другие более тонкие различия. Не оставляйте произвольный код на глобальном уровне. Поместите его в функцию и вызовите его после импорта, как предложено в принятом ответе вместо – jfs 13 January 2015 в 19:18

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

execfile("test2.py")

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

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

108
ответ дан John Y 16 August 2018 в 02:19
поделиться
  • 1
    напрямую, что мне нужно в python 32, это exec (open ('test2.py'). read ()) – fantastory 16 March 2012 в 12:43
  • 2
    Этот подход выполняет скрипты в вызывающем пространстве имен. :) – dmvianna 21 October 2013 в 06:46
  • 3
    Это определенно не «лучший». или "большинство pythonic" способ сделать это, но это именно то, что я искал :) – ArtOfWarfare 21 May 2014 в 16:34
  • 4
    для передачи аргументов командной строки скрипту вы можете отредактировать список sys.argv. – jfs 13 January 2015 в 19:09
  • 5
    Более полное лечение эквивалентов Python 3: stackoverflow.com/questions/436198/… – John Y 4 August 2016 в 15:38

Если вы хотите, чтобы 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
16
ответ дан Michael Schneider 16 August 2018 в 02:19
поделиться
  • 1
    Что делать, если у вас есть параметры времени выполнения? – Gabriel Fair 17 June 2018 в 20:00

Другой способ:

Файл test1.py:

print "test1.py"

Файл service.py:

import subprocess

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

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

Документация: Python 2 , Python 3

52
ответ дан P1h3r1e3d13 16 August 2018 в 02:19
поделиться
  • 1
    Мне пришлось использовать subprocess.call("./test1.py", shell=True), чтобы он работал – asmaier 17 April 2013 в 10:45
  • 2
    Не используйте shell=True, если это не необходимо. – Piotr Dobrogost 3 November 2013 в 12:58
  • 3
    @PiotrDobrogost - Не могли бы вы указать, какие ситуации это потребует? – sancho.s 26 December 2013 в 15:12
  • 4
    @ sancho.s Например, если у вас довольно сложная команда bash, и вы не хотите, чтобы переводил ее в код Python. – Piotr Dobrogost 27 December 2013 в 23:22
  • 5
    Он не будет работать на типичном Unix, где текущий каталог не находится в PATH. 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()
10
ответ дан thedz 16 August 2018 в 02:19
поделиться
  • 1
    когда вы импортируете test1, как он знает, где находится файл? она должна быть в том же каталоге? что, если его нет? – NULL.Dude 3 April 2018 в 19:50

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

1
ответ дан xcrafter_40 16 August 2018 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: