Python模块导入对于一个文件有效,却失败了另一个文件

2024-10-03 21:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

奇怪的是,昨天一切都很好,但其中一个文件今天不起作用了。同时我还没碰过进口货。在

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

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

owclassifi公司cationpythagorastree.py

^{pr2}$

好的职业pythagorastree.py

^{pr2}$

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

Traceback (most recent call last): File "owclassificationpythagorastree.py", line 6, in from orangecontrib.prototypes.widgets.owpythagorastree import OWPythagorasTree ImportError: No module named 'orangecontrib.prototypes'

这种情况在其他项目中也发生过好几次,但最终它自己解决了。但我不知道是什么原因造成的。在

我确实尝试过在我的普通机器和python virtualenv上运行这个模块,在那里我安装了这个模块(我是在基本目录中使用pip install -e .来完成的)。在

我看不出这种行为的明显原因,它困扰了我很多,所以任何关于为什么会发生这种情况以及如何解决它的帮助或见解都将不胜感激。在


编辑

根据请求,我在两个脚本的顶部运行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/requests-2.9.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-packages', '/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-linux', '/home/pavlin/dev/orange3env/lib/python3.5/site-packages', '/usr/lib/python3.5/site-packages/setuptools-18.7.1-py3.5.egg', '/home/pavlin/.local/lib/python3.5/site-packages']


Tags: 文件pydevhomeinitegglibpackages
2条回答

只是一个想法。你检查权限了吗?可能是权限搞砸了,给你带来了麻烦。在

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

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

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

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

import sys
print(sys.path)

另外,请记住,目录只有在有__init__.py文件时才是可导入的——您没有在代码中说明是否是这样。在

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

^{pr2}$

我希望如果您从基本目录.运行python orangecontrib/prototypes/widgets/owclassificationpythagorastree.py,这两个都可以正常工作,而不需要修改您的PYTHONPATH,因为python总是首先在当前目录中查找绝对导入的模块。在

如果您是从widgets目录运行的,我希望它不会工作,除非您首先将基本目录添加到PYTHONPATH。在

不过,作为一个一般性的提示,除了非常小的事情之外,您应该避免将模块代码与脚本代码混合在一起,正是因为这些原因!创建设计为从命令行运行的单独的python脚本,以及设计为导入的python模块代码。避免生成也可以作为脚本从命令行运行的模块。在

相关问题 更多 >