Вы можете использовать __ file __
, чтобы получить путь к пакету, например:
import os
this_dir, this_filename = os.path.split(__file__)
DATA_PATH = os.path.join(this_dir, "data", "data.txt")
print open(DATA_PATH).read()
Я думаю, что нашел ответ.
Я делаю модуль data_path.py, который я импортирую в другие мои модули, содержащие:
data_path = os.path.join(os.path.dirname(__file__),'data')
И затем я открываю все свои файлы с помощью
open(os.path.join(data_path,'filename'), <param>)
Часто существует не, указывают в создании ответа, который подробно излагает код, который делает не работа, как, но я полагаю, что это исключение. Python 3.7 добавил importlib.resources
, который, как предполагается, заменяет pkg_resources
. Это работало бы на доступ к файлам в пакетах, которые не имеют наклонные черты на их имена, т.е.
foo/
__init__.py
module1.py
module2.py
data/
data.txt
data2.txt
, т.е. Вы могли получить доступ data2.txt
внутренний пакет foo
с, например
importlib.resources.open_binary('foo', 'data2.txt')
, но это перестанет работать за исключением для [1 117]
>>> importlib.resources.open_binary('foo', 'data/data.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/importlib/resources.py", line 87, in open_binary
resource = _normalize_path(resource)
File "/usr/lib/python3.7/importlib/resources.py", line 61, in _normalize_path
raise ValueError('{!r} must be only a file name'.format(path))
ValueError: 'data/data2.txt' must be only a file name
, Это не может быть зафиксировано кроме путем размещения __init__.py
в data
и затем использования его в качестве пакета:
importlib.resources.open_binary('foo.data', 'data.txt')
причина этого поведения , "это дизайном" ; но дизайн мог бы измениться ...