Exécution d'un script python dans ipython

122

Est-il possible d'exécuter un script python (pas un module) à partir d'ipython sans indiquer son chemin? J'ai essayé de définir PYTHONPATH mais cela semble ne fonctionner que pour les modules. Je voudrais exécuter

%run my_script.py

sans être dans le répertoire contenant le fichier.

Tyler Durden
la source
import <module>est essentiellement le même que exec(<moduleSource>)dans JavaScript ou Perl.
Vortico du
14
+1 pour la syntaxe% run abc.py - essayait de chercher cela
Sid Kshatriya
1
vous pouvez utiliser le chemin:% run ../scripts/my_scripts par exemple
Jose A. Martín
pour les scripts CLI développés avec la bibliothèque Click cela ne fonctionne pas pour moi, j'obtiens: IOErrorTraceback (dernier appel en dernier) /home/miguelfg/workspace/projects*********/db_preparation.py dans <module > () 1270 1271 si nom == " main ": -> 1272 main () 1273 1274 ...
miguelfg

Réponses:

126

à partir du répertoire de "my_script.py", vous pouvez simplement faire:

%run ./my_script.py
rakke
la source
meilleure réponse pour la simplicité et la concision
Evhz le
SyntaxError: invalid syntaxici, sur la console Python . Python 3.5.3 sur Debian 9. Cependant, fonctionne sur IPython.
rotton le
1
@rotton c'est parce que %runc'est une commande magique ipython, qui ne fait pas partie du langage Python lui-même.
HugoMailhot le
28

Comment exécuter un script en Ipython

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

Ça devrait le faire

CubeBot88
la source
16

La %runmagie a un paramètre file_finderqu'elle utilise pour obtenir le chemin complet du fichier à exécuter (voir ici ); comme vous le notez, il regarde simplement dans le répertoire courant, en ajoutant ".py" si nécessaire.

Il ne semble pas y avoir de moyen de spécifier quel chercheur de fichiers utiliser à partir de la %runmagie, mais rien ne vous empêche de définir votre propre commande magique qui appelle %runavec un chercheur de fichiers approprié.

En tant que hack très méchant, vous pouvez remplacer la valeur file_finderpar défaut par la vôtre:

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

Pour être honnête, au rythme de l'évolution de l'API IPython, il est tout aussi probable que la définition de votre propre magie continue de fonctionner.

ecatmur
la source
16

En python, il n'y a aucune différence entre les modules et les scripts; Vous pouvez exécuter à la fois des scripts et des modules. Le fichier doit être sur le pythonpath AFAIK car python doit pouvoir trouver le fichier en question. Si python est exécuté à partir d'un répertoire, le répertoire est automatiquement ajouté au pythonpath.

Reportez-vous à Quelle est la meilleure façon d'appeler un script Python à partir d'un autre script Python? pour plus d'informations sur les modules et les scripts

Il existe également une fonction intégrée execfile (nom de fichier) qui fera ce que vous voulez

Serpents et café
la source
1
C'est aussi ce que je pensais. Cependant, en pratique, les modules peuvent être importés mais les scripts ne sont pas trouvés par l'interpréteur à moins qu'ils ne soient démarrés à partir du répertoire auquel ils appartiennent.
Tyler Durden
1
Lisez docs.python.org/tutorial/modules.html#the-module-search-path pour plus d'informations. Il détaille où il doit être placé pour que python trouve le fichier. Plus précisément, de nombreux modules peuvent servir de scripts en utilisant la ligne "if __name__== ' __main__':" à la fin
Snakes and Coffee
0

pour Python 3.6.5

import os
os.getcwd()
runfile('testing.py')
Alinafe
la source
1
Est runfile()une commande de ipython? Ça ne marche pas pour moi.
user3342981