【问题标题】:Python package import own files, without knowing the package name at compile timePython包导入自己的文件,编译时不知道包名
【发布时间】:2014-09-11 14:51:38
【问题描述】:
 - app.py
 - Datatypes/
    - string/
       - __init__.py
       - SomeModule.py

我的 python 应用程序动态加载包,将每个包加载到 Datatypes 目录中,如果字符串模块 (init.py) 想要导入 SomeModule.py,它必须使用它从 app 中的路径导入。 py(正在执行的文件) 例如。

import Datatypes.string.SomeModule

我宁愿有办法导入相关模块,而不必知道包名(目录名) 例如。

import __self__.SomeModule

这可能吗?如果是这样,我将如何实现这一目标

【问题讨论】:

    标签: python python-2.7 dynamic python-3.x import


    【解决方案1】:

    如果您不知道路径,请使用os.listdir() 查找。

    如果您知道路径,请使用__import__

    >>> math.factorial(10)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'math' is not defined
    >>> mod='math'
    >>> math=__import__(mod)
    >>> math.factorial(10)
    3628800
    

    当然,您需要保留对模块(在我的示例中为变量 math)或模块中您以后要使用的元素的引用。

    【讨论】:

      【解决方案2】:

      如果文件在同一目录下,则可以正常使用

      import module_name
      

      如果absolute imports已经开启,那么你仍然可以导入相对路径

      from . import module_name
      

      【讨论】:

      • import module_name 似乎不起作用,如果我从 init.py 调用 import SomeModule 会出错
      • 第二种显式相对形式呢?
      • 刚试了第二个,效果很好。非常感谢你
      【解决方案3】:

      我在一个临时目录中创建了一个类似的结构:

      .
      ./main.py
      ./package
      ./package/__init__.py
      ./package/sub_module.py
      

      main.py 只是将包的所有变量导入其自己的命名空间并打印命名空间的内容:

      from package import *
      from pprint import pprint
      print(dir())
      

      package/__init__.py 文件在 被导入时运行。它使用 relative 模块引用来指定所需的模块可以在同一目录中找到:

      from .sub_module import *
      

      package/sub_module.py 模块由包的__init__.py 导入。它只是设置了三个变量:

      x = y = z = 0
      

      程序运行时...

      airhead:tmp sholden$ python main.py
      ['__builtins__',
       '__doc__',
       '__file__',
       '__name__',
       '__package__',
       'pprint',
       'sub_package',
       'x',
       'y',
       'z']
      

      可以看到,package\sub_module.py 中的名称是通过包命名空间导入到主模块的命名空间中的。

      因为包可以具有递归结构,您可以使用两个点来表示包含包之上的包,三个点表示包含该包的包,依此类推。虽然如果您需要三个以上的点,您可能需要考虑重构:-)。

      该系统是在PEP 328 中设计和记录的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        相关资源
        最近更新 更多