Ejecutando el script de Python dentro de ipython

122

¿Es posible ejecutar un script de Python (no un módulo) desde dentro de ipython sin indicar su ruta? Intenté configurar PYTHONPATH pero parece funcionar solo para módulos. Me gustaria ejecutar

%run my_script.py

sin estar en el directorio que contiene el archivo.

Tyler Durden
fuente
import <module>es esencialmente el mismo que exec(<moduleSource>)en JavaScript o Perl.
Vortico
14
+1 para la sintaxis% run abc.py - estaba tratando de buscar eso
Sid Kshatriya
1
puede usar la ruta:% run ../scripts/my_scripts por ejemplo
Jose A. Martín
para los scripts de CLI desarrollados con la biblioteca Click no me funciona, obtengo: IOErrorTraceback (última llamada más reciente) /home/miguelfg/workspace/projects**********/db_preparation.py en <módulo > () 1270 1271 if name == " main ": -> 1272 main () 1273 1274 ...
miguelfg

Respuestas:

126

desde el directorio de "my_script.py", simplemente puede hacer:

%run ./my_script.py
rastrillar
fuente
la mejor respuesta para la simplicidad y la concisión
Evhz
SyntaxError: invalid syntaxaquí, en la consola de Python . Python 3.5.3 en Debian 9. Sin embargo, funciona en IPython.
Rotton
1
@rotton eso es porque %runes un comando mágico de ipython, no parte del lenguaje Python en sí.
HugoMailhot
28

Cómo ejecutar un script en Ipython

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

Deberias hacer eso

CubeBot88
fuente
16

La %runmagia tiene un parámetro file_finderque usa para obtener la ruta completa al archivo para ejecutar (ver aquí ); como nota, solo busca en el directorio actual, agregando ".py" si es necesario.

No parece haber una forma de especificar qué buscador de archivos usar desde la %runmagia, pero no hay nada que le impida definir su propio comando mágico que llama a%run con un buscador de archivos apropiado.

Como truco muy desagradable, podría anular el predeterminado file_findercon el suyo:

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

Para ser honesto, al ritmo que cambia la API de IPython, es tan probable que continúe funcionando como lo es definir su propia magia.

ecatmur
fuente
16

En Python no hay diferencia entre módulos y scripts; Puede ejecutar tanto scripts como módulos. El archivo debe estar en pythonpath AFAIK porque Python debe poder encontrar el archivo en cuestión. Si python se ejecuta desde un directorio, entonces el directorio se agrega automáticamente a la ruta de python.

Consulte ¿Cuál es la mejor manera de llamar a un script de Python desde otro script de Python? para obtener más información sobre módulos vs scripts

También hay una función incorporada execfile (nombre de archivo) que hará lo que quieras

Serpientes y Café
fuente
1
Eso es también lo que pensé. Sin embargo, en la práctica, los módulos se pueden importar, pero el intérprete no encuentra los scripts a menos que se inicien desde el directorio al que pertenecen.
Tyler Durden
1
Lea docs.python.org/tutorial/modules.html#the-module-search-path para obtener más información. Detalla dónde debe colocarse para que Python encuentre el archivo. Más específicamente, muchos módulos pueden funcionar como scripts usando la línea "if __name__== ' __main__':" al final
Snakes and Coffee
0

para Python 3.6.5

import os
os.getcwd()
runfile('testing.py')
Alinafe
fuente
1
¿Es runfile()un comando de ipython? No funciona de inmediato para mí.
user3342981