首页 > 解决方案 > pip 安装的模块指向 anaconda 路径而不是实际路径

问题描述

我在我的 git repo 中有以下 python 模块,我pip install my_package在一个已经存在的同名 conda 环境中签出它my_package

my_package
├── Makefile
├── data
├── my_package(renamed src so that I could import `my_package`)
│   ├── __init__.py
│   ├── config.py
│   ├── data
│   │   ├── __init__.py
│   │   ├── script.py
│   ├── utils.py
├── setup.py
├── test_environment.py
└── tox.ini

我在代码库之外有一个data目录,用于保存我的数据并希望script.py使用相对路径访问它。

from pathlib import Path
my_path = Path(__file__).resolve().parent 
do something with my_path

问题是my_path返回我的 anaconda 路径,而不是文件的当前路径。

我试过了pip install -e . my_packagepip install --install-options"--prefix=$(pwd)" my_package当我尝试在子目录中执行脚本时,这似乎不起作用my_package

如何my_path指向我的当前目录?

我的setup.py样子是这样的。使用 python 3.7.3 和 Mac OSX

from pathlib import Path

setup(
    name="my_package",
    packages=find_packages(),
    version="0.2.0",
    description="",
    author="",
    license="",
    install_requires=[
        "numpy", "pandas", "pytest"
    ],
)

标签: pythonpython-3.xpipcondasetuptools

解决方案


如果您想访问数据,那么最好将其作为您的软件包的一部分,请参阅setuptools文档中的“包含数据文件”

原因是当您安装 Python 项目时,您对最终编写代码的确切位置没有太多控制权。通常,不属于 Python 包的文件根本不会与 Python 代码一起安装。所以您的代码无法访问您的数据。

当您使用可编辑( pip install -e .) 或开发( ./setup.py develop) 模式时,它可以工作,是的,但更多的是巧合。因为代码没有实际安装(它只是被指向),它在文件系统上的位置不会改变,它与数据的相对位置也不会改变。

另一方面,如果您将数据与其余代码正确打包,那么它最终安装在哪里并不重要,数据将与它一起安装。然后代码总是可以找到数据,请参阅importlib.resources以了解如何编写可以读取包数据的代码。


推荐阅读