簡體   English   中英

Python venv ModuleNotFoundError

[英]Python venv ModuleNotFoundError

(在給我重復的問題投票之前,請注意我在這個問題上找到的所有內容都與virtualenv有關,而不是venv)

系統

  • Ubuntu Server 16.04
  • 安裝了Python 3.6,Python 3.5原生

背景 (舉例說明,可能有一兩個錯字,但這個想法是重要的部分)

我有一個項目形式:

Project/
├── __init__.py
└── project
    ├── packageA
    │   ├── fileA.py
    │   └── __init__.py
    └── packageB
        ├── fileB.py
        └── __init__.py

在fileb.py中,我有一個import語句,如

import project.packageA.fileA

我創造了一個venv;

cd /path/to/Project; python3.6 -m venv .venv; source .venv/bin/activate

然后我跑了

source project/packageB/fileB.py

這會給我一個錯誤:

ModuleNotFoundError: no module named 'project'

試圖解決

  1. 將“Project”和“project”的路徑添加到$ PATH
  2. 修改.venv / bin / activate腳本中的$ PYTHONPATH,以便sys.path現在指向“Project”和“project”
  3. 完全閱讀這里的文檔
  4. 已驗證os.sys.path顯示項目和項目路徑

問題 :必須可以使用venv進行模塊導入,否則它將是零值 - 所以我的設置中根本缺少什么? (有了viritualenv,我剛用'add2virtualenv')

[ 編輯 - 顯示更多詳細信息]

# Changes to .venv/bin/activate
PYTHONPATH="/home/steve/Temp/Project:/home/steve/Temp/Project/project:$PYTHONPATH"
export PYTHONPATH

python -c "import os; print(os.sys.path)"
['', '/home/steve/Temp/Project', '/home/steve/Temp/Project/project', .....

[ Edit2 - 將包A添加到PYTHONPATH作品]

如果我將'path / to / packageA'添加到我的PYTHONPATH,導入工作。 要使用它,我必須將每個子包添加到我的項目中 - 對於大型項目來說不太理想。

這條線

​$ source project/packageB/fileB.py

因為失敗了

  1. import路徑搞砸了,它包含project文件夾,但不應該
  2. project 可能不在您的PYTHONPATH

要解決這個問題

步驟1)修復fileB.pyimport語句,用你的import替換

​import packageA.fileA

步驟2)通過檢查bash環境, PYTHONPATH確認是否已將project添加到PYTHONPATH

​$ echo $PYTHONPATH     # does it contain `path/to/project`?

如果沒有暫時修復它

​$ export PYTHONPATH=path/to/project:$PYTHONPATH   # forget `/path/to/Project` you only need `path/to/Project/project`

(注意$PATH更改與Python package/module搜索無關,因此這是一次浪費的嘗試)。

然后,當您運行腳本時,它不會失敗:

$ source project/packageB/fileB.py      # success?!

順便說一句,最好用python調用你的python腳本:

$ python project/packageB/fileB.py

最后,通過編輯虛擬環境bin目錄中的activate腳本來永久更新虛擬環境。 PYTHONPATH導出添加到頂部附近的某處。

這是一個有點模糊的情況恕我直言。 我的解決方案是:為你的項目創建一個setup.py(無論如何都是有益的),並使用激活的venv做一個“python setup.py develop”。

這會將您的項目添加到PTH文件中,因此您可以導入。

setup.py的示例,取自interwebs:

# from http://python-packaging.readthedocs.io/en/latest/minimal.html

from setuptools import setup

setup(name='funniest',
      version='0.1',
      description='The funniest joke in the world',
      url='http://github.com/storborg/funniest',
      author='Flying Circus',
      author_email='flyingcircus@example.com',
      license='MIT',
      packages=['funniest'],
      zip_safe=False)

暫無
暫無

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

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