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ę.
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()
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.
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.
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
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()
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')
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)
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.
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