Установленный модуль pip указывает на путь анаконды, а не на реальный путь - PullRequest
0 голосов
/ 29 октября 2019

У меня есть следующий модуль python в моем git-репо, который я извлекаю, и я 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 возвращает мой путь к анаконде, а не текущий путь кфайл.

Я попытался 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"
    ],
)

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Если вы хотите получить доступ к данным, то лучше всего включить их в ваш пакет, см. Документацию setuptools в разделе «Включение файлов данных» .

Причина в том, что когда вы устанавливаете ваш проект Python, вы не имеете большого контроля над точным местоположением, где ваш код заканчивается написанием. И обычно, файлы, которые не являются частью пакета Python, просто не устанавливаются вместе с вашим кодом Python. Поэтому ваш код не может получить доступ к вашим данным.

Когда вы используете режимы редактируемый (pip install -e .) или разработка (./setup.py develop), он работаетДа, но это скорее совпадение. Поскольку код на самом деле не установлен (на него только указывают), его местоположение в файловой системе не меняется, и его относительное расположение к данным также не меняется.

С другой стороны, если выправильно упакуйте данные вместе с остальным кодом, тогда не имеет значения, где они заканчиваются, данные устанавливаются вместе с ним. Затем код всегда может найти данные, см. importlib.resources , чтобы узнать, как написать код, который может читать данные пакета.

0 голосов
/ 30 октября 2019

pip install -e ./

решил мою проблему

...