Python venv ModuleNotFoundError

Python venv ModuleNotFoundError,python,python-3.x,python-venv,Python,Python 3.x,Python Venv,(在用重复的问题投票给我打分之前,请注意我能找到的关于这个问题的一切都与virtualenv有关,而不是与venv有关) 系统: Ubuntu服务器16.04 已安装Python 3.6,Python 3.5本机 背景 (人为的例子,所以可能有一两个打字错误,但想法是重要的部分) 我有一个项目,形式如下: Project/ ├── __init__.py └── project ├── packageA │   ├── fileA.py │   └── __init_

(在用重复的问题投票给我打分之前,请注意我能找到的关于这个问题的一切都与virtualenv有关,而不是与venv有关)

系统

  • Ubuntu服务器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'
试图解决以下问题:

  • 将路径添加到“Project”并将“Project”添加到$path
  • 在.venv/bin/activate脚本中修改$PYTHONPATH,使sys.path现在指向“Project”和“Project”
  • 完全阅读文档
  • 已验证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-将packageA添加到PYTHONPATH作品中]


    如果我将“path/to/packageA”添加到我的PYTHONPATH中,导入工作正常。要使用它,我必须将每个子包添加到我的项目中——这对于大型项目来说并不理想。我的解决方案是:为您的项目创建一个setup.py(无论如何都是有益的),并使用激活的venv执行“python setup.py develope”

    这将把您的项目添加到一个PTH文件中,因此您可以导入

    setup.py示例取自互联网站:

    # 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)
    
    这条线

    ​$ source project/packageB/fileB.py
    
    失败是因为

  • 导入
    路径混乱,它包括
    项目
    文件夹,但不应包含该文件夹
  • project
    可能不在您的
    PYTHONPATH
  • 修理它

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

    ​import packageA.fileA
    
    步骤2)通过检查
    bash
    环境,自行确认是否已将
    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包/模块
    搜索无关,因此这是徒劳的尝试)

    然后,当您运行脚本时,它不会失败:

    $ source project/packageB/fileB.py      # success?!
    
    顺便说一下,最好使用
    python
    调用您的python脚本:

    $ python project/packageB/fileB.py
    

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

    谢谢你的回答。您知道添加了哪个“PTH”文件吗?我不能独立于安装程序添加到同一个文件中吗?好吧,这似乎是可行的——但这完全是胡说八道——我不能相信一个工具如果没有优雅的方式来处理像导入这样的基本问题的话会被发布——无论如何,你只是个信使,所以谢谢你帮我摆脱困境。我得承认这对我来说也总是有点麻烦。OTOH我做的大多数事情最终都会有一个setup.py,所以。。。。显然virtualenv有一个东西(甚至都不知道)叫做add2virtualenv。最终,可能是20行代码发生在VeV上-你可能会考虑提交一个bug。至于PTH文件——不知道。只需grep浏览站点包并查找包路径。我的示例被简化了,实际上每个包都有一个init文件,就像“project”一样。我的PYTHON路径添加到了venv/bin/activate文件中。我通过python-c“importos;print(os.sys.path)”来确认这一点。我添加了项目和项目。此外,当从pycharm中运行时,导入将按原样工作。我会在早上更新细节,但我想我已经有了基础。除非你说,对于嵌套包,我必须将所有子目录添加到最后一个分支。我真的很感谢你的帮助,顺便说一句。。。这真是让我扫兴。而且,deets方法使进口产品能够正常工作。另外,将旧版虚拟环境与add2virtualenv一起使用可以使导入工作正常。好的,我在回答中删除了对
    \uuuu init\uuuu.py
    的引用,因为我看到您已将其编辑到您的问题中。