繁体   English   中英

Python导入,路径,目录和模块

[英]Python Imports, Paths, Directories & Modules

首先让我说我已经对过去一周的过程进行了广泛的研究,但还没有找到这些问题的实际答案 - 只是一些模糊的答案并没有真正解释发生了什么。 如果这只是因为我错过了我想要的东西,我很抱歉 - 请指出我正确的方向。

我的目录结构是:

TestProject/
    runtest*
    testpackage/
        __init__.py
        testmod.py
        testmod2.py
        testsubs/
            testsubmod.py

几个笔记:

  • 我在Ubuntu上使用python2.7
  • 我正在测试bpython
  • 我正在从特定目录运行bpython来测试导入行为的方式
  • 我正在尝试遵循最佳做法。
  • 这个软件包没有安装,它在一个随机的dev目录中
  • 该目录不在pythonpath中
  • 我在包目录中有一个init .py
  • 嵌套目录中没有init .py文件
  • init .py文件为空
  • testpackage / testmod.py包含TestModClass
  • testpackage / testsubs / testsubmod.py包含TestSubModClass

我观察到的事情:

  • 当我从TestProject / import testpackage运行bpython时
    • 这不会导入testpackage.testmod
    • 我根本无法访问testpackage.testmod
  • 当我从TestProject / import运行bpython时, testpackage.testmod失败了
  • 当我从testProject运行bpython / 从testpackage导入testmod工作
  • 我可以向init .py添加代码以显式导入testmod.py,但不能testubs / testmod.py
    • 我不认为这是正确的方法,如果用户不想导入该模块怎么办?
  • 从testmod.py我可以导入testmod2,但不能导入testpackage.testmod2
    • 这样做很好,我可以使用STL或扭曲的名称(例如testpackage.logging)命名我自己的模块,而不会导致错误(很糟糕的是必须命名我自己的模块废话,如customerlogging,而不仅仅是mypackage。日志记录)

问题是:

  1. python路径中存在的包和模块上的导入与您尝试从当前目录导入时的python处理方式不同吗?
  2. 为什么不导入testpackage让我访问testpackage.testmod? 当我导入操作系统时,我可以访问os.path(etc)。
  3. 使用包,我应该坚持在基目录中使用单个init .py,还是应该将它们嵌套在后续目录中?
  4. 如何导入指定包名称的模块? 来自testmod.py的IE,我想导入testpackage.testmod2而不仅仅是testmod2。
  5. 从subsubs目录导入子模块的正确方法是什么?
    1. 我看到的唯一解决方案是将该目录从init .py附加到pythonpath,但我不知道这是否正确。

提前致谢。

首先,您将在The Python Tutorial的第6部分找到所需的所有信息。


(1)python路径中存在的包和模块上的python与您尝试从当前目录导入时的处理方式不同吗?

不,它没有。 实际上,Python在导入模块时总是搜索sys.path 仅找到当前目录中的模块,因为sys.path包含带有空字符串的条目,表示当前目录。


(2)为什么不import testpackage让我访问testpackage.testmod 当我导入os ,我可以访问os.path (etc)。

为了提高效率, import testpackage只加载testpackage/__init__.py 如果你需要testpackage.testmod ,你必须明确地导入它:

import testpackage   # Just imports testpackage, not testpackage.testmod!
import testpackage.testmod   # Import *both* testpackage and testpackage.testmod!

如果你总是想导出testmod ,在__init__.py导入它,这就是osos/__init__.py )所做的。 这样,如果导入testpackagetestpackage.testmod总是隐含可用。

由于Python是跨平台的,因此实际上无法在目录中一致地自动加载模块,因为某些文件系统不区分大小写(Windows!)。 Python不知道是否将os/path.py加载为os.pathos.Path等。


(3)对于一个包,我应该坚持在基目录中使用单个__init__.py ,还是应该将它们嵌套在后续目录中?

每个子包总是需要__init__.py 有关于放弃这一要求的讨论,但决定保持原样。


(4)如何导入指定包名称的模块? 来自testmod.py IE,我想导入testpackage.testmod2而不仅仅是testmod2

这应该工作。 只需确保从顶级目录运行代码。 如果当前目录是testpackage ,则testmod不知道它在包中。

但首选的方法是使用相对的包内导入:

from . import testmod2

如果存在名为testmod2的全局模块,则可以防止名称冲突,并且可以使用包中的已知模块的名称而不会出现问题。


(5)从subsubs目录导入子模块的正确方法是什么? 我看到的唯一解决方案是将该目录从__init__.py附加到pythonpath,但我不知道这是否正确。

不,不要那样做! 永远不要把一个目录下sys.path当它的一个父目录已经在sys.path 这可能导致您的模块加载两次,这是一件坏事!

通常,您应该能够使用绝对或相对导入从子包加载模块:

import testpackage.testsubs.testsubmod
from testpackage.testsubs import testsubmod
from .testsubs import testsubmod

只需确保在testsubs/创建__init__.py

  1. 不。当前目录刚刚添加到PYTHONPATH。
  2. 首先,你需要一个__init__.py。 其次,os.path是因为os正在导入os.path。
  3. 每个目录中需要__init__.py,也包含testpackage目录。
  4. 在包的__init__.py中,导入您要提供的模块。
  5. 来自sub1.sub2 import子模块
    1. 不,如果最顶层的目录在PYTHONPATH上,并且这个和子目录有__init__.py,那么您只需要从任何子目录导入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM