Ресурсы, живущие в файловой системе
Стандартный способ чтения файла, смежного с вашим скриптом python:
a) Если у вас есть python> = 3.4, я бы предложилвы используете модуль pathlib , например:
from pathlib import Path
def fetch_wordlist(filename="wordlist.txt"):
return (Path(__file__).parent / filename).read_text()
if __name__ == '__main__':
print(fetch_wordlist())
b) И если вы все еще используете версию Python <3.4 или все еще хотите использовать старый добрый <a href="https://docs.python.org/3/library/os.path.html" rel="noreferrer">os.path модуль, вы должны сделать что-то вроде этого:
import os
def fetch_wordlist(filename="wordlist.txt"):
with open(os.path.join(os.path.dirname(__file__), filename)) as f:
return f.read()
if __name__ == '__main__':
print(fetch_wordlist())
Кроме того, я бы предложил вам захватывать исключения во внешних вызывающих, вышеупомянутые методы являются стандартным способом чтения файлов в Python, так что выне нужно заключать их в такие функции, как fetch_wordlist
, в противном случае чтение файлов в python является «атомарной» операцией.
Теперь может случиться так, что вы заморозили свою программу, используя какой-то морозильник, напримеркак cx_freeze
, pyinstaller
или подобные ... в этом случае вам нужно это обнаружить, вот простой способ проверить это:
a) с помощью os.path
:
if getattr(sys, 'frozen', False):
app_path = os.path.dirname(sys.executable)
elif __file__:
app_path = os.path.dirname(__file__)
b) с использованием pathlib
:
if getattr(sys, 'frozen', False):
app_path = Path(sys.executable).parent
elif __file__:
app_path = Path(__file__).parent
Ресурсы, находящиеся в zip-файле
Вышеприведенные решения будут работать, если код находится в файловой системе, но не будут работать, если пакет находится внутри zip-файла. Когда это происходит, вы можете использовать либо importlib.resources (new inверсия 3.7) или pkg_resources combo, как вы уже показали в вопросе (или вы можете заключить в некоторых помощниках), или вы можете использовать хорошую стороннюю библиотеку под названием importlib_resources
, которая должна работать со старыми и современнымиВерсии Python:
Специально для вашей конкретной проблемы я бы посоветовал вам взглянуть на этот https://importlib -resources.readthedocs.io / en / latest / using.html # file-system-or-zip-file .
Если вы хотите знать, что эта библиотека делает за кулисами, потому что вы не желаете устанавливать какую-либо стороннюю библиотеку, вы можете найти код для py2 здесь и py3 здесь на случай, если вы хотите получить соответствующуюбиты для вашей конкретной проблемы