簡體   English   中英

ModuleNotFoundError:ubuntu 上沒有名為“包”的模塊

[英]ModuleNotFoundError: No module named 'package' on ubuntu

我有一個 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 上運行完全相同的命令並且沒有問題。 值得一提的是,我的 Mac 上有 Ubuntu 上的 python 3.6 和 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/

這也沒有幫助。 這已經成為一個麻煩,我一直無法找到一個很好的資源來解釋這一切。 因此,非常感謝任何幫助。

更新:我忘了提到我from package.conf.my_conf import somevar在 python3 本身中運行,沒有任何問題。

這是我解決問題的方法,我將其發布在這里以防萬一它可能對其他人有所幫助。 如問題中所述,我意識到運行以下代碼沒有問題:

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設置正確

嘗試將您的導入更改為

from .package.conf.my_conf import somevar

注意“包”之前的點(。)。 它告訴 python 查看當前目錄,而不是去搜索 python 庫目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM