Jaki jest najlepszy sposób na wywołanie skryptu z innego skryptu?

Mam skrypt o nazwie test1.py którego nie ma w module. Ma tylko kod, który powinien zostać wykonany, gdy skrypt jest uruchomiony. Nie ma funkcji, klas, metod itp. Mam inny skrypt, który działa jako usługa. Chcę zadzwonić test1.py ze skryptu uruchomionego jako usługa.

Na przykład:

Plik test1.py

print "I am a test"
print "see! I do nothing productive."

Plik service.py

# Lots of stuff here
test1.py # do whatever is in test1.py

Znam jedną metodę, która polega na otwarciu pliku, odczytaniu jego zawartości i ewaluacji. I ' m zakładając, że jest na to lepszy sposób. A przynajmniej mam taką nadzieję.

Author: martineau, 2009-07-27

8 answers

Zwykły sposób, aby to zrobić jest coś takiego jak poniżej.

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()
 217
Author: ars,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-27 07:12:30

Jest to możliwe w Pythonie 2 używając

execfile("test2.py")

Zobacz dokumentację , aby zapoznać się z obsługą przestrzeni nazw, jeśli jest to ważne w Twoim przypadku.

Należy jednak rozważyć użycie innego podejścia; twój pomysł (z tego co widzę) nie wygląda zbyt czysto.

 108
Author: balpha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 15:32:17

Inny sposób:

Plik test1.py:

print "test1.py"

Plik service.py:

import subprocess

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

Zaletą tej metody jest to, że nie musisz edytować istniejącego skryptu Pythona, aby umieścić cały jego kod w podprogramie.

Dokumentacja: Python 2, Python 3

 52
Author: Dick Goodwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 20:17:52

Jeśli chcesz test1.py aby pozostać wykonywalnym z taką samą funkcjonalnością jak w przypadku wywołania wewnątrz service.py, to zrób coś w stylu:

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
Author: Michael Schneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-27 07:11:51

Nie powinieneś tego robić. Zamiast tego do:

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
Author: thedz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-27 07:06:37

Użycie import test1 do pierwszego użycia-wykona skrypt. W przypadku późniejszych wywołań należy traktować skrypt jako zaimportowany moduł I wywoływać reload(test1) metoda.

Gdy reload(module) jest wykonywane:

  • Kod modułów Pythona jest rekompilowany, a kod poziomu modułów jest ponownie dekompilowany , definiując nowy zestaw obiektów, które są powiązane z nazwami w słowniku modułu. Funkcja init modułów rozszerzeń nie jest wywoływana

A proste sprawdzenie sys.modules może być użyty do wywołania odpowiedniego działania. Aby nadal odwoływać się do nazwy skryptu jako string ('test1'), użyj 'import()' / align = "left" /

import sys
if sys.modules.has_key['test1']:
    reload(sys.modules['test1'])
else:
    __import__('test1')
 7
Author: gimel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-27 07:32:00
import os

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

Za pomocą systemu operacyjnego możesz wykonywać połączenia bezpośrednio do swojego terminala. Jeśli chcesz być jeszcze bardziej szczegółowy, możesz połączyć swój łańcuch wejściowy ze zmiennymi lokalnymi, np.

command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)
 5
Author: Alex Mapley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-05 08:07:00

Dlaczego po prostu nie zaimportować test1? Każdy skrypt Pythona jest modułem. Lepszym sposobem byłoby posiadanie funkcji np. main / run in test1.py, Importuj test1 i uruchom test1.main (). Lub można wykonać test1.py jako podproces.

 1
Author: Anurag Uniyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-26 05:23:26