草庐IT

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

coder 2023-08-26 原文

首先让我说,我在过去一周进行了广泛的研究,但尚未找到这些问题的实际答案 - 只是一些模糊的答案,无法真正解释正在发生的事情。如果那只是因为我错过了我要找的东西,我很抱歉 - 请指出正确的方向。

我的目录结构是:

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

一些注意事项:

  • 我在 Ubuntu 上使用 python2.7
  • 我正在使用 bpython 进行测试
  • 我正在从特定目录运行 bpython 以测试导入行为的方式
  • 我正在努力遵循最佳实践。
  • 这个包没有安装,它在一个随机的开发目录中
  • 这个目录不在python路径中
  • 我在包目录中有一个init.py
  • 嵌套目录中没有init.py文件
  • init.py 文件为空
  • testpackage/testmod.py 包含 TestModClass
  • testpackage/testsubs/testsubmod.py 包含 TestSubModClass

我观察到的事情:

  • 当我从 TestProject 运行 bpython 时,import testpackage 有效
    • 这不会导入 testpackage.testmod
    • 我根本无法访问 testpackage.testmod
  • 当我从 TestProject/import testpackage.testmod 运行 bpython 时失败
  • 当我从 TestProject/from testpackage import testmod 运行 bpython 时
  • 我可以将代码添加到 init.py 以显式导入 testmod.py,而不是 testsubs/testmod.py
    • 我认为这不是正确的方法,如果用户不想导入该模块怎么办?
  • 我可以从 testmod.py 导入 testmod2,但不能导入 testpackage.testmod2
    • 这样做会很好,这样我就可以用与 STL 或扭曲名称重叠的名称(例如 testpackage.logging)命名我自己的模块,而不会导致错误(不得不将我自己的模块命名为 customerlogging 之类的废话,而不是只是 mypackage.logging)

还有问题:

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

提前致谢。

最佳答案

首先,您会在section 6 of The Python Tutorial 中找到您需要的所有信息。 .


(1) Does python deal differently with imports on packages & modules that exist in the pythonpath than when you are trying to import from your current directory?

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


(2) Why doesn't import testpackage give me access to testpackage.testmod? When I import os, I can then access 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中导入它,这就是os (os/__init__ .py) 会。这样,如果您导入 testpackagetestpackage.testmod 始终隐式可用。

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


(3) With a package, should I stick to using a single __init__.py in the base directory, or should I be nesting them in subsequent directories?

对于每个子包,您总是需要一个 __init__.py。曾就取消此要求进行过讨论,但最终决定保持原样。


(4) How can I import a module specifying the package name? I.E. from testmod.py, I would like to import testpackage.testmod2 rather than just testmod2.

这应该有效。只需确保从顶级目录运行代码即可。如果当前目录是 testpackagetestmod 不知道它在包中。

不过,首选方法是使用相对包内导入:

from . import testmod2

如果有一个名为 testmod2 的全局模块,这可以防止名称冲突,并使您能够毫无问题地在包中使用众所周知的模块的名称。


(5) What is the proper way to import submodules from the subsubs directory? The only solution I see is to append that directory to the pythonpath from __init__.py, but I don't know if that's the correct way.

不,不要那样做!永远不要将一个目录放到 sys.path 中,而当它的父目录之一已经在 sys.path 中时!这可能会导致您的模块被加载两次,这是一件坏事!

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

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

只需确保在 testsubs/ 中创建一个 __init__.py!

关于Python 导入、路径、目录和模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7163204/

有关Python 导入、路径、目录和模块的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  6. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  7. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  8. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  9. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  10. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

随机推荐