草庐IT

Python 找不到模块

coder 2023-08-24 原文

给定以下 python 项目,在 PyDev 中创建:

├── algorithms
│   ├── __init__.py
│   └── neighborhood
│       ├── __init__.py
│       ├── neighbor
│       │   ├── connector.py
│       │   ├── __init__.py
│       │   ├── manager.py
│       │   └── references.py
│       ├── neighborhood.py
│       ├── tests
│       │   ├── fixtures
│       │   │   └── neighborhood
│       │   ├── __init__.py
│       └── web
│           ├── __init__.py
│           └── service.py
├── configuration
│   ├── Config.py
│   └── __init__.py
├── __init__.py
└── webtrack
    |- teste.py
    ├── .gitignore
    ├── __init__.py
    ├── manager
        ├── Data.py
        ├── ImportFile.py
        └── __init__.py

我们一直在尝试将模块从一个文件夹导入到另一个文件夹,但没有成功,例如:

from algorithms.neighborhood.neighbor.connector import NeighborhoodConnector

产生结果:

Traceback (most recent call last):
File "teste.py", line 49, in <module>
from algorithms.neighborhood.neighbor.connector import NeighborhoodConnector
ImportError: No module named algorithms.neighborhood.neighbor.connector

我们尝试将其路径附加到 sys.path 变量,但没有成功。

我们还尝试使用 os.walk 将所有路径插入 PATH 变量,但我们仍然得到相同的错误,即使我们检查 PATH 确实包含查找模块的路径。

我们在 Linux Ubuntu 13.10 上使用 Python 2.7。

我们有什么地方做错了吗?

提前致谢

最佳答案

在运行包内的脚本时正确导入是很棘手的。您可以阅读 this section of the (sadly deferred) PEP 395 以了解无法运行此类脚本的一系列方法的描述。

给出一个文件系统层次结构,如:

top_level/
    my_package/
        __init__.py
        sub_package/
            __init__.py
            module_a.py
            module_b.py
            sub_sub_package/
                __init__.py
                module_c.py
        scripts/
            __init__.py
            my_script.py
            script_subpackage/
                 __init__.py
                 script_module.py

只有几种方法可以使 my_script.py 正常运行。

  1. 首先是将top_level文件夹放入PYTHONPATH环境变量中,或者使用.pth文件来实现同样的事情。或者,在解释器运行后,将该文件夹插入 sys.path(但这可能会变得很丑陋)。

    请注意,您要将 top_level 添加到路径中,而不是 my_package!我怀疑这就是您当前尝试使用此解决方案时遇到的问题。很容易出错。

    然后,像 import my_package.sub_package.module_a 这样的绝对导入将大部分正常工作。 (当它作为 __main__ 模块运行时,不要尝试导入 package.scripts.my_script 本身,否则你会得到一个奇怪的模块副本。)

    但是,绝对导入总是比相对导入更冗长,因为您总是需要指定完整路径,即使您正在导入兄弟模块(或“侄女”模块,如 module_c 来自 module_a)。对于绝对导入,获取 module_c 的方法总是一大堆丑陋的代码 from my_package.sub_package.sub_sub_package import module_c 而不管导入的是哪个模块。

  2. 因此,使用相对导入通常更为优雅。 las,他们很难从脚本开始工作。唯一的方法是:

    1. 使用 -m 标志从 top_level 文件夹运行 my_script(例如 python -m my_package.scripts。 my_script) 而不是文件名。

      如果您在不同的文件夹中,或者如果您使用不同的方法运行脚本(例如在 IDE 中按 F5),它将不起作用。这有点不灵活,但实际上并没有任何方法可以让它变得更容易(直到 PEP 395 得到推迟和实现)。

    2. 为绝对导入设置 sys.path(例如,将 top_level 添加到 PYTHONPATH 或其他内容),然后使用 PEP 366 __package__ 字符串告诉 Python 你的脚本预期的包是什么。也就是说,在 my_script.py 中,您希望将类似这样的内容置于所有相关导入之上:

      if __name__ == "__main__" and __package__ is None:
          __package__ = "my_package.my_scripts"
      

      如果您重新组织文件组织并将脚本移动到不同的包,这将需要更新(但这可能比更新大量绝对导入的工作少)。

    一旦您实现了其中一种解决方案,您的导入就会变得更简单。从 module_a 导入 module_c 变成 from .sub_sub_package import module_c。在 my_script 中,像 from ..subpackage import module_a 这样的相对导入就可以了。

关于Python 找不到模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19972669/

有关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 - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

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

  6. 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

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

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

  8. 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

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

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

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐