Как получить conda, чтобы узнать, где находятся данные и файлы конфигурации моего пакета - PullRequest
0 голосов
/ 19 января 2020

Я создал пакет Python (3.7), и до сих пор я устанавливал и запускал его в venv. Я хочу сделать то же самое с Conda, но он, похоже, не знает, где находятся мои данные и файлы конфигурации.

Структура каталогов выглядит следующим образом:

- setup.py
- my_pkg
    + bin
        + my_main.py
        + my_script1.py
        + my_params.py
        + params.json
    + lib
        + utils.py
    + data
        + my_data_file.dat

Мой setup.py включает в себя:

scripts = ['my_pkg/bin/my_main.py','my_pkg/bin/my_scripts.py'],
packages = ['my_pkg'],
include_package_data=True

Все отлично работает, когда я устанавливаю в виртуальной среде и затем запускаю

python my_pkg/bin/my_main.py`

Однако в Conda среда не знает, где находятся мои файлы params и данные. Первая ошибка, которую я получаю, это

ModuleNotFoundError: No module named my_params.py

, когда я делаю

import my_params

Как мне написать скрипт setup.py, чтобы это работало?

1 Ответ

0 голосов
/ 23 января 2020

Я бы порекомендовал вам посмотреть и использовать setuptools ' точки входа , в частности console_scripts. Это позволит вам создавать исполняемые сценарии из кода в пакетах.

См. раздел "Automati c Script Creation" документации setuptools ' .

Так может выглядеть весь проект:

MyProject
├── MANIFEST.in
├── mypackage
│   ├── bin
│   │   ├── __init__.py
│   │   └── main.py
│   ├── data
│   │   ├── file.txt
│   │   └── __init__.py
│   ├── __init__.py
│   ├── lib
│   │   ├── __init__.py
│   │   └── utils.py
│   └── __main__.py
└── setup.py

setup.py

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='MyProject',
    version='1.2.3',
    packages=setuptools.find_packages(),
    include_package_data=True,
    entry_points={
        'console_scripts': [
            'mymain = mypackage.bin.main:main',
        ],
    },
)

MANIFEST.in

recursive-include mypackage data/*.txt

mypackage/__main__.py

import mypackage.bin.main

if __name__ == '__main__':
    mypackage.bin.main.main()

mypackage/bin/main.py

import mypackage.lib.utils

def main():
    mypackage.lib.utils.foo()

mypackage/lib/utils.py

import pkgutil

def foo():
    print(pkgutil.get_data('mypackage', 'data/file.txt').decode())

Созданный автоматически консольный сценарий можно затем вызвать следующим образом:

$ mymain

В качестве альтернативы сам пакет является (в некотором смысле) исполняемым и может вызываться следующим образом:

$ python3 -m mypackage
...