我有一个结构如下的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
时没有任何问题。
答案 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
这解决了问题。因此,总而言之,我采取了以下步骤:
__init__.py
存在于所有子目录中PYTHONPATH
设置正确答案 1 :(得分:-1)
尝试将导入更改为
from .package.conf.my_conf import somevar
在“ package”之前注意Dot(。)。它告诉python查看当前目录,而不是进入并搜索python库目录。