繁体   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