Tengo un archivo llamado foobar (sin .py extensión). En el mismo directorio que tengo otro archivo de python que intenta importar:

import foobar

Pero esto sólo funciona si me cambie el nombre del archivo foobar.py. Es posible importar un módulo de python que no tiene .py extensión?

Actualización: el archivo no tiene extensión, porque yo también lo utilizan como una secuencia de comandos independiente, y no quiero escribir el .py extensión para ejecutarlo.

Update2: voy a ir a por el enlace simbólico solución se mencionan a continuación.

Estoy intrigado. ¿Por qué usted tiene un archivo de python sin la py extensión?
A veces es bueno usar python para los archivos de configuración (extensión como .conf) o para referirse a un tipo especial de archivo. En mi caso, sería más de una conveniencia para un Administrador.
Tengo un archivo con la configuración que se utiliza tanto como un archivo de python y como un script de bash. Me dio un pysh extensión…
Si que está relacionada con la configuración de las cosas, recomiendo el uso de ConfigParser. wiki.python.org/moin/ConfigParserExamples
Una razón es la de secuencias de comandos de python .las extensiones cgi en lugar de .py extensión

OriginalEl autor compie | 2010-04-08

5 Comentarios

  1. 37

    Puede utilizar el imp.load_source función (de la imp módulo), para la carga de un módulo de forma dinámica a partir de un determinado sistema de archivos de la ruta.

    foobar = imp.load_source('foobar', '/path/to/foobar')

    Este ASÍ discusión también muestra algunas opciones interesantes.

    Fijo. [es más constructivo para sugerir una Edición, aunque]
    pero de nuevo la sección es necesaria por lo que he entendido >>> foobar = imp.load_source(«,’credenciales’) [default] NameError: name ‘default’ no está definido
    ¿Cuál es el uso de la primer argumento 'foobar' si se le asigna en el valor de retorno?
    Se establece el módulo de __name__ propiedad; normalmente esto está determinado desde el nombre de archivo, pero ya que usted está utilizando un estándar de nombre de archivo (que incluso podría no contener cualquier código python identificador en todos), se tiene que especificar el nombre del módulo. El nombre de la variable en la que se almacena una referencia a la creación del módulo de objeto es irrelevante, tanto como si import foo.bar as baz el módulo que hace referencia la variable baz todavía tendrá su original __name__.
    Esto ha sido en desuso desde 3.4. ¿Alguna idea de cómo importar desde un archivo sin el .py extensión de 3.4+?

    OriginalEl autor Eli Bendersky

  2. 14

    Como otros han mencionado, puede utilizar imp.load_source, pero para hacer el código más difícil de leer. Realmente sólo lo recomiendo si usted necesita para importar módulos cuyos nombres o caminos no son conocidos hasta el tiempo de ejecución.

    ¿Cuál es tu razón para no querer usar el .py extensión? El caso más común para no querer usar el .py extensión, es debido a que la secuencia de comandos de python también se ejecuta como un archivo ejecutable, pero usted todavía desea que otros módulos para poder importar. Si este es el caso, puede ser beneficioso para la funcionalidad de mover en una .py archivo con un nombre similar, y, a continuación, utilizar foobar como un contenedor.

    O en lugar de envolver, solo enlace simbólico foobar.py para foobar (suponiendo que no estás en Windows)
    sí, sería mucho más limpio. Usted podría utilizar una .bat para windows para lograr la misma cosa.
    Tengo una casa de casos de uso – un archivo readme, con ejemplos, que me gustaría doctest para validar. Estoy esperando hacer un doctest rebajas doc que funciona…
    Y la respuesta es (para que el caso de uso) – uso doctest.loadfile!
    El problema con los wrappers es que si alguien ingenuamente copias sólo el envoltorio a un bin/ directorio, el programa no funcionará cuando se ejecuta desde la ruta de acceso.

    OriginalEl autor

  3. 13

    imp.load_source(module_name, path) debe hacer, o que puede hacer el más detallado imp.load_module(module_name, file_handle, ...) ruta si usted tiene un identificador de archivo en lugar

    OriginalEl autor Daniel DiPaolo

  4. 9

    Aquí es una solución para Python 3.4+:

    from importlib.util import spec_from_loader, module_from_spec
    from importlib.machinery import SourceFileLoader 
    
    spec = spec_from_loader("foobar", SourceFileLoader("foobar", "/path/to/foobar"))
    foobar = module_from_spec(spec)
    spec.loader.exec_module(foobar)

    Utilizando spec_from_loader y la especificación explícita de una SourceFileLoader será la fuerza de la maquinaria para cargar el archivo como fuente, sin tratar de averiguar el tipo de archivo de la extensión. Esto significa que usted puede cargar el archivo aunque no aparece en importlib.de la maquinaria.SOURCE_SUFFIXES.

    Si quieres mantener importar el archivo por el nombre después de la primera carga, añadir el módulo de sys.modules:

    sys.modules['foobar'] = foobar
    El módulo que necesita un foobar = importlib.nice_import('foobar') ayudante desesperadamente.
    Ya tiene que. No creo que /some/arbitrary/file.weird_extension califica como «buena». Dicho esto, he empezado a utilizar el código de python para todos mis archivos de configuración una vez que he descubierto este. Es tan conveniente.

    OriginalEl autor Mad Physicist

  5. 1

    Si instalar la secuencia de comandos con el administrador de paquetes (deb o igual) otra opción sería el uso de setuptools:

    «…no hay ninguna manera fácil de tener un script de nombre de archivo del partido de local de los convenios tanto en Windows como en las plataformas POSIX. Por otro, que a menudo tienen que crear un archivo separado sólo por los «principales» de secuencia de comandos, cuando su «principal» es una función en un módulo, en algún lugar… setuptools soluciona todos estos problemas mediante la generación automática de secuencias de comandos con la extensión correcta, y en Windows incluso crear una .archivo exe…»

    https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation

    OriginalEl autor user2745509

Dejar respuesta

Please enter your comment!
Please enter your name here