Здесь вы можете попытаться сделать две разные вещи:
- Рассматривайте файлы данных как часть вашего пакета, как модули Python, и обращайтесь к ним во время выполнения, как если бы ваш пакет был обычным деревом каталогов, даже если это не так.
- Получите файлы данных, установленные в другом месте в
pip install
время, в место, к которому вы можете получить обычный доступ.
Оба объяснения описаны в разделе о файлах данных в документы PyPA/setuptools
. Я думаю, вам нужен первый здесь, который описан в подразделе Доступ к файлам данных во время выполнения:
Как правило, существующие программы манипулируют атрибутом __file__
пакета, чтобы найти расположение файлов данных. Однако эта манипуляция несовместима с обработчиками импорта на основе PEP 302, включая импорт из zip-файлов и Python Eggs. Настоятельно рекомендуется, если вы используете файлы данных, использовать ResourceManager API из pkg_resources
для доступа к ним. Модуль pkg_resources
распространяется как часть setuptools
, поэтому, если вы используете setuptools
для распространения своего пакета, нет причин не использовать его API управления ресурсами. См. также Доступ к ресурсам пакетов для быстрого примера преобразования кода, использующего __file__
для использования pkg_resources
вместо этого.
Перейдите по этой ссылке, и вы обнаружите что-то похожее на старую документацию PEAK, но это только потому, что это действительно старая документация PEAK. Существует версия, спрятанная внутри setuptools
документов, которую вам может быть легче читать. и перемещайтесь, как только вам удастся его найти.
Как говорится, вы можете try
использовать get_data
(который будет работать внутри egg/zip), а затем вернуться к доступу к файлу (который будет работать при запуске из исходного кода), но вам лучше используя обертки в pkg_resources
. В принципе, если ваш код делал это:
path = os.path.join(__file__, 'Wordproject/WordProject/Repository/DataBank/', datathingy)
with open(path) as f:
for line in f:
do_stuff(line)
… вы измените его на это:
path = 'Wordproject/WordProject/Repository/DataBank/' + datathingy
f = pkg_resources.resource_stream(__name__, path)
for line in f:
do_stuff(line.decode())
Обратите внимание, что файлы resource_stream
всегда открываются в двоичном режиме. Поэтому, если вы хотите прочитать их как текст, вам нужно обернуть их TextIOWrapper
или декодировать каждую строку.
person
abarnert
schedule
11.04.2018
pip install
время или встроить их в каталог пакета и получить к ним доступ так же, как к подмодулям? - person abarnert   schedule 11.04.2018PyPI
, так как это организационная вещь. Но меня больше интересуетobfuscation
кода, чтобы даже при доступе никто не мог декомпилировать пакет. И поэтому я хочу, чтобы файлы были встроены в сам пакет. - person iam.Carrot   schedule 11.04.2018