Ausführen des Python-Skripts in ipython

122

Ist es möglich, ein Python-Skript (kein Modul) in ipython auszuführen, ohne dessen Pfad anzugeben? Ich habe versucht, PYTHONPATH einzustellen, aber es scheint nur für Module zu funktionieren. Ich würde gerne ausführen

%run my_script.py

ohne in dem Verzeichnis zu sein, das die Datei enthält.

Tyler Durden
quelle
import <module>ist im Wesentlichen das gleiche wie exec(<moduleSource>)in JavaScript oder Perl.
Vortico
14
+1 für die Syntax% run abc.py - hat versucht, danach zu suchen
Sid Kshatriya
1
Sie können den Pfad verwenden:% run ../scripts/my_scripts zum Beispiel
Jose A. Martín
Für CLI-Skripte, die mit der Click-Bibliothek entwickelt wurden, funktioniert dies bei mir nicht. Ich erhalte: IOErrorTraceback (letzter Aufruf zuletzt) ​​/home/miguelfg/workspace/projects*********/db_preparation.py in <module > () 1270 1271 if name == " main ": -> 1272 main () 1273 1274 ...
miguelfg

Antworten:

126

Aus dem Verzeichnis von "my_script.py" können Sie einfach Folgendes tun:

%run ./my_script.py
Rakke
quelle
beste Antwort für Einfachheit und Prägnanz
Evhz
SyntaxError: invalid syntaxhier auf der Python-Konsole . Python 3.5.3 unter Debian 9. Funktioniert jedoch unter IPython.
Rotton
1
@rotton Das %runliegt daran, dass es sich um einen ipython-Magiebefehl handelt, der nicht Teil der Python-Sprache selbst ist.
HugoMailhot
28

So führen Sie ein Skript in Ipython aus

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

Das sollte es tun

CubeBot88
quelle
16

Die %runMagie hat einen Parameter file_finder, mit dem sie den vollständigen Pfad zur auszuführenden Datei abruft (siehe hier ). Wie Sie bemerken, wird es nur im aktuellen Verzeichnis angezeigt und bei Bedarf ".py" angehängt.

Es scheint keine Möglichkeit zu geben, anzugeben, welcher Dateisucher aus der %runMagie verwendet werden soll, aber nichts hindert Sie daran, Ihren eigenen magischen Befehl zu definieren, der %runmit einem geeigneten Dateisucher aufgerufen wird.

Als sehr böser Hack könnten Sie den Standard file_findermit Ihrem eigenen überschreiben :

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

Um ehrlich zu sein, bei der Geschwindigkeit, mit der sich die IPython-API ändert, funktioniert dies wahrscheinlich genauso wie die Definition Ihrer eigenen Magie.

ecatmur
quelle
16

In Python gibt es keinen Unterschied zwischen Modulen und Skripten. Sie können sowohl Skripte als auch Module ausführen. Die Datei muss sich auf dem Python-Pfad AFAIK befinden, da Python die betreffende Datei finden kann. Wenn Python aus einem Verzeichnis ausgeführt wird, wird das Verzeichnis automatisch zum Pythonpfad hinzugefügt.

Siehe Wie kann man ein Python-Skript am besten von einem anderen Python-Skript aus aufrufen? Weitere Informationen zu Modulen und Skripten

Es gibt auch eine eingebaute Funktion execfile (Dateiname), die macht, was Sie wollen

Schlangen und Kaffee
quelle
1
Das habe ich auch gedacht. In der Praxis können Module jedoch importiert werden, aber Skripte werden vom Interpreter nicht gefunden, es sei denn, sie werden aus dem Verzeichnis gestartet, zu dem sie gehören.
Tyler Durden
1
Weitere Informationen finden Sie unter docs.python.org/tutorial/modules.html#the-module-search-path . Es gibt an, wo es abgelegt werden muss, damit Python die Datei findet. Insbesondere können viele Module als Skripte verwendet werden, indem die Zeile "if __name__== ' __main__':" am Ende verwendet wird
Snakes and Coffee
0

für Python 3.6.5

import os
os.getcwd()
runfile('testing.py')
Alinafe
quelle
1
Ist runfile()ein Befehl von ipython? Funktioniert bei mir nicht sofort.
user3342981