如何用conda将本地文件夹作为包安装?附相对导入问题及后续疑问
核心问题
我会在「测试脚本(playground scripts)」中试验/测试自己编写的Python代码。通常不会保留这些测试脚本,但最近发现长期保存它们有价值,因此决定单独创建一个测试目录。
问题场景
已激活conda环境myproject,工作目录结构如下:
~/x __init__.py something.py ~/x/playground playscript.py
希望在playscript.py中导入something.py,并通过Jupyter以交互式窗口运行playscript.py。尝试相对导入something.py时失败,报错信息:
ImportError: attempted relative import with no known parent package
截至2024年6月,conda develop已被废弃,查阅资料后多人推荐使用命令:pip install --no-build-isolation --no-deps -e .
疑问
若修改~/x/something.py或新增模块,是否需要重新执行pip install --no-build-isolation --no-deps -e .?若需要,该方案并不理想。
关于可编辑模式的更新问题
使用pip install --no-build-isolation --no-deps -e .(可编辑模式)后:
- 修改现有模块(如
something.py)的代码无需重新执行该命令,因为可编辑模式会将项目目录直接链接到conda环境的site-packages目录,代码修改会实时生效。 - 仅当新增顶级模块文件(如在
~/x下添加new_module.py)或修改项目配置文件(如pyproject.toml、setup.py)时,才需要重新执行该命令,让Python识别新增的模块结构。
其他替代方案
临时添加模块路径
在playscript.py开头加入以下代码,临时将上层目录加入Python的模块搜索路径:
import sys from pathlib import Path # 将上层目录(~/x)添加到模块搜索路径 sys.path.append(str(Path(__file__).parent.parent)) import something
这种方法无需安装包,修改代码后直接运行脚本即可生效,适合快速测试场景。
设置PYTHONPATH环境变量
激活conda环境后,执行以下命令临时设置环境变量:
export PYTHONPATH="$HOME/x:$PYTHONPATH"
之后运行Jupyter或脚本时,Python会自动搜索~/x目录下的模块,代码修改实时生效。若想永久生效,可将该命令添加到conda环境的激活脚本(如~/miniconda3/envs/myproject/etc/conda/activate.d/env_vars.sh)中。
内容的提问来源于stack exchange,提问作者bzm3r

