python - 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_package
,pip 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"
],
)
解决方案
如果您想访问数据,那么最好将其作为您的软件包的一部分,请参阅setuptools文档中的“包含数据文件”。
原因是当您安装 Python 项目时,您对最终编写代码的确切位置没有太多控制权。通常,不属于 Python 包的文件根本不会与 Python 代码一起安装。所以您的代码无法访问您的数据。
当您使用可编辑( pip install -e .
) 或开发( ./setup.py develop
) 模式时,它可以工作,是的,但更多的是巧合。因为代码没有实际安装(它只是被指向),它在文件系统上的位置不会改变,它与数据的相对位置也不会改变。
另一方面,如果您将数据与其余代码正确打包,那么它最终安装在哪里并不重要,数据将与它一起安装。然后代码总是可以找到数据,请参阅importlib.resources以了解如何编写可以读取包数据的代码。
推荐阅读
- c++ - C ++将字符串作为十六进制值中的连续(不可读)字符
- java - 取消部署jar时如何关闭EntityManagerFactory?
- sql - 从 Google Cloud SQL 导出到 GCS 失败
- automation - 空手道 DSL:支持 MQTT 测试
- html - 工具提示和 html 问题?
- arrays - 下标超出范围
- woocommerce - 过滤 Woocommerce 订单项目的产品标题
- angular - 为什么我会收到“No provider for serviceName 错误”?
- javascript - jquery ui sortable + draggable 获取被拖动项目的当前索引
- cuda - 错误:类“cooperative_groups::__v1::thread_block”没有成员“is_valid”