繁体   English   中英

Python模块导入适用于一个文件,另一个文件失败

[英]Python module import works for one file, fails for another

我面临一个非常奇怪的问题。 我有三个文件,第一个包含基类,其他两个文件中的类继承自该基类。

奇怪的是,昨天一切正常,但其中一个文件今天不再起作用了。 在此期间我没有触及过进口商品。

.
└── orangecontrib
    ├──__init__.py
    └── prototypes
        ├──__init__.py
        └── widgets
            ├──__init__.py
            ├── owpythagorastree.py
            ├── owclassificationpythagorastree.py
            └── owregressionpythagorastree.py

因此,分类和回归类需要从基类继承,并且导入以完全相同的方式完成:

owclassificationpythagorastree.py

...
from orangecontrib.prototypes.widgets.owpythagorastree import OWPythagorasTree
...

owregressionpythagorastree.py

...
from orangecontrib.prototypes.widgets.owpythagorastree import OWPythagorasTree
...

然而,当我尝试从命令行运行这两个脚本(使用python owregressionpythagorastree.py )时,回归小部件工作正常,但分类小部件会产生以下错误:

回溯(最近一次调用最后一次):文件“owclassificationpythagorastree.py”,第6行,来自orangecontrib.prototypes.widgets.owpythagorastree import OWPythagorasTree ImportError:没有名为'orangecontrib.prototypes'的模块

这种情况在其他项目中也曾多次发生,但它最终会自行解决。 但令我困扰的是,我不知道造成这种情况的原因。

我尝试从我的常规机器和python virtualenv运行这个,我安装了模块(我在基本目录中使用pip install -e . )。

我没有看到这种行为的明显原因,这让我很烦恼,所以任何帮助或洞察为什么会发生这种情况以及如何解决这一问题将不胜感激。


编辑

根据要求,我运行了import sys; print(sys.path) import sys; print(sys.path)位于两个脚本的顶部,在通过diff运行后,它们都完全相同。 不过,我在这里发布结果。

['/ home / pavlin / dev / orange3-prototypes / orangecontrib / prototypes / widgets','/ home / pavlin / dev / orange3','/ home / pavlin / dev / orange3env / lib / python3.5 / site -packages /setuptools_git-1.1-py3.5.egg','/ home / pavlin / dev / orange-bio','/ home / pavlin / dev / orange3env / lib / python3.5 / site -packages / pyqtgraph-0.9.10 -py3.5.egg','/ home / pavlin / dev / orange3env / lib / python3.5 / site-packages / request-9.1.1-py3.5.egg','/ home / pavlin / dev / orange3env /lib/python3.5/site-packages/slumber-0.7.1-py3.5.egg','/home/pavlin/dev/orange3env/lib/python3.5/site-packages/Genesis_PyAPI-1.2.0- py3.5.egg','/ usr / lib / python3.5 / site-packages / qt_graph_helpers-0.1.3-py3.5-linux-x86_64.egg','/ home / pavlin / dev / orange3-prototypes' ,'/ usr / lib / python3.5 / site-package','/ home / pavlin / dev / orange3env / lib / python35.zip','/ home / pavlin / dev / orange3env / lib / python3.5', '/home/pavlin/dev/orange3env/lib/python3.5/plat-linux','/home/pavlin/dev/orange3env/lib/python3.5/lib-dynload','/ usr / lib64 / python3。 5','/ usr / lib / python3.5','/ usr / lib / python3.5 / plat-linu x','/ home / pavlin / dev / orange3env / lib / python3.5 / site-package','/ usr / lib / python3.5 / site-package / setuptools-18.7.1-py3.5.egg' ,'/ home / pavlin / .local / lib / python3.5 / site-package']

看起来你的问题是对python如何找到模块的不完全理解。

对于绝对导入 (即指定第一个模块的名称,例如import mymodule ,并且不使用句点从代码所属的包进行相对导入,例如from . import mymodule ),查找的顺序是:

  1. 当前目录。
  2. 您环境中PYTHONPATH中的任何目录。
  3. 任何已安装的系统路径,可以通过各种方式设置。

要查看要从中导入的完整路径集,请使用:

import sys
print(sys.path)

此外,请记住,如果目录只有__init__.py文件,则该目录是可导入的 - 您没有说明您的代码是否属于这种情况。

因此,如果您有以下布局:

.
└── orangecontrib
    ├── __init__.py
    └── prototypes
        ├── __init__.py
        └── widgets
            ├── __init__.py
            ├── owpythagorastree.py
            ├── owclassificationpythagorastree.py
            └── owregressionpythagorastree.py

如果你从基目录运行python orangecontrib/prototypes/widgets/owclassificationpythagorastree.py ,我希望如此. ,两者都应该工作得很好,而不需要修改你的PYTHONPATH ,因为python总是首先在当前目录中查找绝对导入的模块。

如果你从widgets目录运行,我希望它不起作用,除非你先将基目录添加到PYTHONPATH

作为一般提示,除了非常小的东西,你应该避免将模块代码与脚本代码混合,正是出于这些原因! 制作单独的python脚本,这些脚本旨在从命令行运行,并单独设计用于导入的python模块代码。 避免制作也可以作为脚本从命令行运行的模块。

只是一个想法。 你检查过权限了吗? 也许某种程度上权限搞砸了,他们给你的问题。

暂无
暂无

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

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