Python venv ModuleNotFoundError

时间:2018-01-06 18:13:37

标签: python python-3.x python-venv

(在给我重复的问题投票之前,请注意我在这个问题上找到的所有内容都与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 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. 完整阅读文档here
  4. 已验证os.sys.path显示项目和项目路径
  5. 问题:必须可以使用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中,则导入有效。要使用它,我必须将每个子包添加到我的项目中 - 对于大型项目来说不太理想。

2 个答案:

答案 0 :(得分:3)

这一行

​$ source project/packageB/fileB.py

失败,因为

  1. import路径搞砸了,它包含project文件夹,但不应该
  2. project 可能不在您的PYTHONPATH
  3. 修复它

    步骤1)在import中修复fileB.py语句,将import替换为

    ​import packageA.fileA
    

    步骤2)通过检查project环境

    ,确认您是否已将PYTHONPATH添加到bash
    ​$ 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
    

    最后,通过编辑虚拟环境的activate目录中的bin脚本来永久更新虚拟环境。将PYTHONPATH导出添加到顶部附近的某处。

答案 1 :(得分:0)

嘘这是一个有点模糊的情况恕我直言。我的解决方案是:为你的项目创建一个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)