Python venv ModuleNotFoundError
(在用重复的问题投票给我打分之前,请注意我能找到的关于这个问题的一切都与virtualenv有关,而不是与venv有关) 系统: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_
- 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'
试图解决以下问题:
# 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
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
的引用,因为我看到您已将其编辑到您的问题中。