Python venv ModuleNotFoundError
Python venv ModuleNotFoundError
(在给我重复的问题投票之前,请注意我在这个问题上能找到的所有内容都与 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"
- 完整阅读文档here
- 已验证 os.sys.path 显示项目和项目路径
问题:使用 venv 进行模块导入必须是 possible 否则它将是零值——那么我在我的基础上缺少什么设置? (对于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 Works]
如果我将 'path/to/packageA' 添加到我的 PYTHONPATH,导入工作。要使用它,我必须将每个子包添加到我的项目中——对于大型项目来说不太理想。
恕我直言,情况有点模糊。我的解决方案是:为您的项目创建一个 setup.py(无论如何都是有益的),并在激活的 venv 下执行 "python setup.py develop".
这会将您的项目添加到 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
失败因为
import
路径搞砸了,它包括 project
文件夹,但它不应该
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 package/module
搜索无关,因此这是一次无用的尝试)。
然后当你运行你的脚本时,它不会失败:
$ source project/packageB/fileB.py # success?!
顺便说一句,最好用 python
:
调用你的 python 脚本
$ python project/packageB/fileB.py
最后,通过编辑虚拟环境 bin
目录中的 activate
脚本永久更新您的虚拟环境。在靠近顶部的某处添加 PYTHONPATH
导出。
(在给我重复的问题投票之前,请注意我在这个问题上能找到的所有内容都与 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"
- 完整阅读文档here
- 已验证 os.sys.path 显示项目和项目路径
问题:使用 venv 进行模块导入必须是 possible 否则它将是零值——那么我在我的基础上缺少什么设置? (对于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 Works]
如果我将 'path/to/packageA' 添加到我的 PYTHONPATH,导入工作。要使用它,我必须将每个子包添加到我的项目中——对于大型项目来说不太理想。
恕我直言,情况有点模糊。我的解决方案是:为您的项目创建一个 setup.py(无论如何都是有益的),并在激活的 venv 下执行 "python setup.py develop".
这会将您的项目添加到 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
失败因为
import
路径搞砸了,它包括project
文件夹,但它不应该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 package/module
搜索无关,因此这是一次无用的尝试)。
然后当你运行你的脚本时,它不会失败:
$ source project/packageB/fileB.py # success?!
顺便说一句,最好用 python
:
$ python project/packageB/fileB.py
最后,通过编辑虚拟环境 bin
目录中的 activate
脚本永久更新您的虚拟环境。在靠近顶部的某处添加 PYTHONPATH
导出。