(在给我重复的问题投票之前,请注意我在这个问题上找到的所有内容都与virtualenv有关,而不是venv)
系统:
背景 (举例说明,可能有一两个错字,但这个想法是重要的部分)
我的项目形式为:
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'
尝试解决:
问题:必须可以使用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中,则导入有效。要使用它,我必须将每个子包添加到我的项目中 - 对于大型项目来说不太理想。
答案 0 :(得分:3)
这一行
$ source project/packageB/fileB.py
失败,因为
import
路径搞砸了,它包含project
文件夹,但不应该project
可能不在您的PYTHONPATH
修复它
步骤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)
这会将您的项目添加到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)