Python установка запускает скрипты в собственном каталоге - PullRequest
2 голосов
/ 10 июля 2020

У меня такая структура

src/
   setup.py
   my_folder/
             my_script.py
             my_data.json

Мой .py файл использует данные из my_data.json, и он просто указывает на него с помощью пути my_data.json, потому что он прямо рядом с ним? Да, он работает правильно, когда я запускаю его в обычном режиме с помощью python my_script.py, но когда я пытаюсь сделать это через установочный файл и запустить его с каким-то псевдонимом, он явно запускается из каталога /src и не видит мой файл my_data.json, потому что он должен указывать на my_folder/my_data.json. Когда я печатаю os.getcwd(), я вижу, что my_script.py запускается из каталога /src, это немного странно ... Моя установка выглядит так:

setup(
  name='main',
    entry_points={
        'console_scripts': [
            'my_alias = my_folder.my_script:main'
        ],
    },
    include_package_data=True,
    packages=find_packages()
)

Вы знаете, как это сделать? заставить запустить мой скрипт в его каталоге, а не в каталоге, в котором находится установка?

1 Ответ

0 голосов
/ 10 июля 2020

Я настоятельно рекомендую избегать перехода в каталог пакетов, если вы можете этого избежать, но что-то вроде:

import os

os.chdir(os.path.dirname(os.path.abspath(__file__)))

, вероятно, сработает.

, если вам просто нужно получить ресурсов, которые вы включили в свой модуль, вы можете сделать что-то вроде этого в my_script:

import json
import pkg_resources

raw = pkg_resources.resource_string(__name__, 'my_data.json')
data = json.loads(raw)

pkg_resources.resource_string возвращает содержимое my_data. json в виде байтовой строки. Существуют также методы .resource_stream и .resource_filename, если вы хотите иметь возможность открывать их как файлы в пределах python или с подпроцессом соответственно. Это дает вам совместимость со средами zip_safe, которые могут быть полезны или не полезны в зависимости от того, что вы делаете.

Я не уверен, требуется ли это технически, но иногда я обнаруживаю, что сценарии установки не поиграйте с автоматическим добавлением файлов данных в ваш пакет, и требуется некоторое ручное вмешательство, например следующее:

setup(
    name='mypackage',
    entry_points={
        'console_scripts': [
            'my_alias = mypackage.my_script:main'
        ],
    },
    package_data={'mypackage': ['*.json']},  # Important addition
    include_package_data=True,
    packages=find_packages()
)
...