Mam skrypt o nazwie test1.py, który nie znajduje się w module. Ma tylko kod, który powinien zostać wykonany po uruchomieniu samego skryptu. Nie ma żadnych funkcji, klas, metod itp. Mam inny skrypt, który działa jako usługa. Chcę wywołać test1.py ze skryptu działającego 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
Zdaję sobie sprawę z jednej metody, która polega na otwarciu pliku, odczytaniu zawartości i jej ewaluacji. Zakładam, że jest na to lepszy sposób. A przynajmniej mam taką nadzieję.
runpy.run_module
odpowiedzi ?!Odpowiedzi:
Zwykle jest to możliwe w następujący sposób.
test1.py
service.py
źródło
test1.py
znajduje się w odległym katalogu?import test1
inservice.py
faktycznie wykonuje cały skrypt (który tylko definiuje,some_func()
ponieważ__name__ == '__main__'
będzieFalse
w tym przypadku). To brzmi jak wszystko, co OP chce zrobić. Ta odpowiedź wykracza poza to, ale zdecydowanie odpowiada na pytanie - a potem niektóre.test1.py
nie zawiera definicji funkcjisome_func()
(ale na przykład tylko kilka wierszy koduprint("hello")
), wówczas twój kod nie działałby. W tym konkretnym przykładzie działa, ponieważ zasadniczo importujesz funkcję zewnętrzną, którą następnie oddzwaniasz.Jest to możliwe w Pythonie 2 przy użyciu
Zajrzyj do dokumentacji dotyczącej obsługi przestrzeni nazw, jeśli jest to ważne w twoim przypadku.
W Pythonie 3 jest to możliwe przy użyciu (dzięki @fantastory)
Należy jednak rozważyć zastosowanie innego podejścia; twój pomysł (z tego co widzę) nie wygląda na bardzo czysty.
źródło
sys.argv
listę.Inny sposób:
Plik test1.py:
Plik service.py:
Zaletą tej metody jest to, że nie trzeba edytować istniejącego skryptu Python, aby umieścić cały jego kod w podprogramie.
Dokumentacja: Python 2 , Python 3
źródło
subprocess.call("./test1.py", shell=True)
aby to zadziałałoshell=True
chyba że jest to konieczne.test1.py
powinien być wykonywalny i mieć linię shebang (#!/usr/bin/env python
) oraz powinieneś podać pełną ścieżkę, albo sam musisz podać plik wykonywalny:call([sys.executable, os.path.join(get_script_dir(), 'test1.py')])
gdzieget_script_dir()
jest zdefiniowany tutaj .subprocess.call(['python', 'test1.py'])
.Jeśli chcesz, aby plik test1.py pozostawał wykonywalny z taką samą funkcjonalnością, jak w przypadku wywołania service.py, wykonaj następujące czynności:
test1.py
service.py
źródło
Korzystając z systemu operacyjnego, możesz nawiązywać połączenia bezpośrednio z terminalem. Jeśli chcesz być jeszcze bardziej szczegółowy, możesz połączyć swój ciąg wejściowy ze zmiennymi lokalnymi, tj.
źródło
os.system
należy unikać, możesz zrobić to samo z dowolną klasą odPopen, Call,
Nie powinieneś tego robić. Zamiast tego wykonaj:
test1.py:
service.py
źródło
Użyj
import test1
do pierwszego użycia - wykona skrypt. W przypadku późniejszych wywołań traktuj skrypt jako zaimportowany moduł i wywołajreload(test1)
metodę.sys.modules
Można użyć prostej kontroli, aby wywołać odpowiednią akcję. Aby nadal odwoływać się do nazwy skryptu jako ciągu ('test1'
), użyj wbudowanego polecenia „ import ()” .źródło
reload
zniknął w Pythonie 3.if __name__ == "__main__":
ochronę. Mogą występować inne subtelniejsze różnice. Nie pozostawiaj niepożądanego kodu na poziomie globalnym. Zamiast tego należy wprowadzić funkcję i wywołać ją po imporcie, zgodnie z sugestią zawartą w zaakceptowanej odpowiedziWolę Runpy :
źródło
Dlaczego nie po prostu zaimportować test1? Każdy skrypt Pythona jest modułem. Lepszym sposobem byłoby posiadanie funkcji np. Main / run w test1.py, import test1 i run test1.main (). Lub możesz wykonać test1.py jako podproces.
źródło
Jak już wspomniano,
runpy
jest to dobry sposób na uruchomienie innych skryptów lub modułów z bieżącego skryptu.Nawiasem mówiąc, śledzenie lub debugowanie jest dość powszechne, a w takich okolicznościach metody takie jak importowanie pliku bezpośrednio lub uruchamianie pliku w podprocesie zwykle nie działają.
Do
exec
uruchomienia kodu należy również zwrócić uwagę . Musisz podać odpowiednie,run_globals
aby uniknąć błędu importu lub innych problemów. Zobaczrunpy._run_code
szczegóły.źródło
To jest przykład z
subprocess
biblioteką:źródło
Popen
chyba że funkcje wyższego poziomu naprawdę nie mogą zrobić tego, co chcesz. W takim przypadku,check_call
lubrun
zrobiłby wszystko, czego potrzebujesz i więcej, przy znacznie mniejszej ilości hydrauliki we własnym kodzie.Ten proces jest nieco nie ortodoksyjny, ale działałby we wszystkich wersjach Pythona,
Załóżmy, że chcesz wykonać skrypt o nazwie „zalecana.py” w warunku „jeśli”, a następnie użyj,
Technika jest inna, ale działa!
źródło