ModuleNotFoundError:Ubuntu上没有名为“ package”的模块

时间:2019-10-11 17:58:18

标签: python

我有一个结构如下的python项目:

package/
  __init__.py
  conf/
    my_conf.py
    __init__.py
  lib/
    tasks/
      somecode.py
      __init__.py

somecode.py中,我从conf导入,例如:

from package.conf.my_conf import somevar

当我尝试使用以下命令在命令行中执行代码时:

python3 package/lib/tasks/somecode.py 

我收到以下错误:

ModuleNotFoundError: No module named 'package'

这在Ubuntu 18上发生,并且确实很奇怪,因为我在Mac上运行了完全相同的命令,没有任何问题。值得一提的是,我在Ubuntu上有python 3.6,在Mac上有3.7。会有所不同吗?

我一直在阅读有关SO的文章,并且相对导入已经不见了,但我认为这不是问题,因为否则它将无法在Mac上运行。但是,我试了一下,并将代码更新为:

from ...conf.my_conf import somevar

现在我收到一个新错误:

ValueError: attempted relative import beyond top-level package

我还在Ubuntu上将PYTHONPATH设置为:

/usr/local/lib/python3.6/dist-packages/:/home/myusername/package/

,这也没有帮助。这变得很麻烦,而且我一直找不到能够解释这一切的好资源。因此,非常感谢您的帮助。

更新:我忘了提到我在python3本身中运行from package.conf.my_conf import somevar时没有任何问题。

2 个答案:

答案 0 :(得分:0)

这是我解决此问题的方法,我将其发布在此处,以防万一可能对其他人有所帮助。正如问题中提到的那样,我意识到运行以下代码没有问题:

python
from package.conf.my_conf import somevar

所以我认为我的终端和python命令行之间肯定有一些不同。因此,我在两种情况下都比较了PYTHONPATH

echo $PYTHONPATH 

在我的终端上打印:

/home/myusername

还有来自python的以下内容:

import sys
print(sys.path)

打印:

['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/myusername/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']

所以我使用以下命令更新了终端机中的PYTHONPATH

export PYTHONPATH=export PYTHONPATH=/home/myusername:/usr/lib/python36.zip:/usr/lib/python3.6:/usr/lib/python3.6/lib-dynload:/home/myusername/.local/lib/python3.6/site-packages:/usr/local/lib/python3.6/dist-packages:/usr/lib/python3/dist-packages

这解决了问题。因此,总而言之,我采取了以下步骤:

  1. 确保__init__.py存在于所有子目录中
  2. PYTHONPATH设置正确

答案 1 :(得分:-1)

尝试将导入更改为

from .package.conf.my_conf import somevar

在“ package”之前注意Dot(。)。它告诉python查看当前目录,而不是进入并搜索python库目录。