Uruchamianie skryptu Pythona w ipythonie

122

Czy można uruchomić skrypt Pythona (nie moduł) z wnętrza ipythona bez wskazywania jego ścieżki? Próbowałem ustawić PYTHONPATH, ale wygląda na to, że działa tylko dla modułów. Chciałbym wykonać

%run my_script.py

bez znajdowania się w katalogu zawierającym plik.

Tyler Durden
źródło
import <module>jest zasadniczo taka sama jak exec(<moduleSource>)w JavaScript lub Perl.
Vortico,
14
+1 dla składni% run abc.py - próbował tego szukać
Sid Kshatriya
1
możesz użyć ścieżki:% run ../scripts/my_scripts na przykład
Jose A. Martín
w przypadku skryptów CLI opracowanych za pomocą biblioteki Click nie działa, otrzymuję: IOErrorTraceback (ostatnie połączenie) /home/miguelfg/workspace/projects*********/db_preparation.py w <module > () 1270 1271 if name == " main ": -> 1272 main () 1273 1274 ...
miguelfg Kwietnia

Odpowiedzi:

126

z katalogu „my_script.py” możesz po prostu wykonać:

%run ./my_script.py
rakke
źródło
najlepsza odpowiedź na prostotę i zwięzłość
Evhz
SyntaxError: invalid syntaxtutaj, na konsoli Pythona . Python 3.5.3 na Debianie 9. Jednak działa na IPythonie.
rotton
2
@rotton to dlatego, że %runjest to magiczne polecenie ipython, a nie część samego języka Python.
HugoMailhot
28

Jak uruchomić skrypt w Ipythonie

import os
filepath='C:\\Users\\User\\FolderWithPythonScript' 
os.chdir(filepath)
%run pyFileInThatFilePath.py

Że należy to zrobić

CubeBot88
źródło
16

%runMagia ma parametr file_finder, że używa, aby uzyskać pełną ścieżkę do pliku, który ma wykonać (patrz tutaj ); jak zauważyłeś, po prostu przegląda bieżący katalog, dodając „.py”, jeśli to konieczne.

Nie wydaje się być sposób, aby określić, który plik Finder do użytku z tej %runmagii, ale nie ma nic, aby zatrzymać cię od zdefiniowania własnego polecenia magiczną że stawia pod %runodpowiednim File Finder.

Jako bardzo paskudny hack, możesz zastąpić domyślne file_finderustawienie własnym:

IPython.core.magics.execution.ExecutionMagics.run.im_func.func_defaults[2] = my_file_finder

Szczerze mówiąc, w tempie, w jakim zmienia się interfejs API IPython, prawdopodobnie będzie ono nadal działać, podobnie jak definiowanie własnej magii.

ecatmur
źródło
16

W Pythonie nie ma różnicy między modułami a skryptami; Możesz wykonywać zarówno skrypty, jak i moduły. Plik musi znajdować się w pythonpath AFAIK, ponieważ python musi być w stanie znaleźć ten plik. Jeśli python jest wykonywany z katalogu, katalog ten jest automatycznie dodawany do pythonpath.

Zobacz Jaki jest najlepszy sposób wywołania skryptu w języku Python z innego skryptu w języku Python? aby uzyskać więcej informacji na temat modułów i skryptów

Istnieje również wbudowana funkcja execfile (nazwa pliku), która zrobi to, co chcesz

Węże i kawa
źródło
1
Tak też myślałem. Jednak w praktyce moduły można importować, ale interpreter nie odnajduje skryptów, chyba że zostały one uruchomione z katalogu, do którego należą.
Tyler Durden
1
Przeczytaj docs.python.org/tutorial/modules.html#the-module-search-path, aby uzyskać więcej informacji. Wyszczególnia, gdzie należy go umieścić, aby Python znalazł plik. Dokładniej, wiele modułów może pełnić rolę skryptów przy użyciu wiersza "if __name__== __main__':" na końcu
Snakes and Coffee
0

dla Pythona 3.6.5

import os
os.getcwd()
runfile('testing.py')
Alinafe
źródło
1
Czy runfile()rozkaz ipython? Nie działa dla mnie po wyjęciu z pudełka.
user3342981