¿Cómo importar funciones de otros proyectos en Python?

Tengo algún código en un proyecto que me gustaría reutilizar en otro proyecto. ¿Qué necesito hacer (en ambas carpetas) para poder hacer esto?

La estructura del directorio es algo como:

  • Foo
    • Proyecto 1
      • file1.py
      • file2.py
  • Bar
    • Proyecto 2
      • archivoX.py
      • fileY.py

Quiero usar funciones de file1.py y file2.py en fileX.py y fileY.py.

Idealmente, ambos proyectos serán un paquete de Python instalable, repleto de __init__.py y setup.py. Luego podrían instalarse con python setup.py install o similar.

Si eso no es posible, ¡no use execfile() ! Manipule PYTHONPATH para agregar Foo para que funcione la import Project1.file1 .

Por ejemplo, desde Project2 / fileX.py:

 from os import path import sys sys.path.append(path.abspath('../Foo')) from Project1.file1 import something 

Sin embargo, la respuesta real es hacer que cada uno sea un paquete instalable discreto.

Es posible que desee crear un módulo a partir de él y luego importar lo que necesite.

Hay mucho que hacer aquí. debería leer sobre paquetes de Python y administración de módulos http://docs.python.org/2/tutorial/modules.html#packages, pero la idea básica es que fileX necesita saber dónde están file1 y file2 para usarlos.

Para convertir una carpeta en un paquete, solo debe contener un archivo __init__.py . Lo que te sugiero que hagas es (en una terminal)

 $ touch Foo/__init__.py $ touch Foo/Project1/__init__.py 

(asumiendo que estás usando unix / linux).

Entonces, de alguna manera, fileX necesita saber dónde está el paquete Foo . Puede llamar a sys.path.append(PATH) donde PATH es la ubicación de Foo.

finalmente dentro de fileX.py tendrías

 import sys sys.path.append(PATH) #replace PATH with the path to Foo from Foo.Project1 import file1 #use its functions file1.function_name(argument) 

si realmente quiere decir solo function_name sin el file1. precedente1 file1. puede importar todas sus funciones diciendo from Foo.Project1.file1 import * sin embargo, tenga en cuenta que from module import * está muy mal visto ya que mezcla nombres y hace que el código sea menos legible y comprensible

Toma el código que desea utilizar en ambos proyectos y lo coloca en un módulo , que extrae en un tercer proyecto separado. Ese proyecto lo convierte en un paquete, en el que puede trabajar por separado. Luego liberas la versión de la misma y la reutilizas en tus otros proyectos.

Es importante que tenga versiones que “libere” para poder realizar un seguimiento de qué versión del módulo utiliza cada proyecto. De lo contrario, terminará en una situación en la que un proyecto anterior deja de funcionar porque ha realizado cambios incompatibles en el módulo común.

Si es genéricamente utilizable no solo para usted sino para otros, considere subirlo a PyPI .

Creo que puedes agregar Foo a la ruta de Python actual usando os.path.join() o os.path.append() y hacerlo from import Project1.file1 import function_name .