где возможно. Хорошее дополнение к теме, проголосовало!

аюсь упаковать свой проект Python, который поставляется с файлом конфигурации, который я хочу скопировать в домашний каталог пользователя при установке. В кратком руководстве по упаковке сказано, что это можно сделать с помощьюdata_files аргументsetuptools.setup, Итак, вот что я имею:

data_files = [(os.path.expanduser("~"), [".my_config"])]

Это выглядит нормально работать, если я используюpython setup.py install, но когда я загружаю свой пакет в PyPI и запускаюpip install точечный файл не копируется.

FWIW, я положил дотфайл вMANIFEST.in а также пытался в том числеpackage_data аргументsetup, Ни один из этих шагов, кажется, не имеет значения. Если яpip install и ковырятьсяsite-packages каталог, просто исходные файлы находятся здесь.

Как мне достичь того, что я ищу?

Ответы на вопрос(2)

data_files вообще! Потому что это действительно непредсказуемо, куда файлы будут скопированы. Вы можете проверить это, задав каталогу что-то вроде'', '/', или же'/anything/you/want'.

Я предлагаю вам использоватьpackage_data вместо этого, который просто копирует файлы в корневой каталог распределенного пакета при установке. Затем вы можете скопировать это куда угодно во время выполнения.

Для больше наpackage_dataобратитесь к Python Dochttps://docs.python.org/2/distutils/setupscript.html#installing-package-data

 hoefling25 сент. 2018 г., 23:33
Еще одно преимущество использованияpackage_data простой и независимый от ОС доступ к установленным файлам данных черезpkg_resources API. Я также предпочитаю использоватьpackage_data где возможно. Хорошее дополнение к теме, проголосовало!
Решение Вопроса

с которой я однажды столкнулся. Его корень заключается в том, что при создании файла колеса все абсолютные пути, указанные вdata_files будет относиться к целиsite-packages каталог, см.этот вопрос на github, Это влияет на установки, выполняемыеpip install как он будет строить колесо из любого пакета с исходным кодом (.tar.gz, .tar.bz2 или же.zip) и установите получившееся колесо:

$ pip install spam-0.1.tar.gz 
Processing ./spam-0.1.tar.gz
<b>Building wheels for collected packages: spam
  Running setup.py bdist_wheel for spam ... done</b>
  Stored in directory: /Users/hoefling/Library/Caches/pip/wheels/d0/95/be/bc79f1d589d90d67139481a3e706bcc54578fdbf891aef75c0
Successfully built spam
Installing collected packages: spam
Successfully installed spam-0.1

Проверка установленных файлов дает:

$ pip show -f spam
Name: spam
Version: 0.1
...
Location: /Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages
Requires: 
Files:
  <b>Users/hoefling/.my_config</b>
  spam-0.1.dist-info/DESCRIPTION.rst
  spam-0.1.dist-info/INSTALLER
  spam-0.1.dist-info/METADATA
  spam-0.1.dist-info/RECORD
  spam-0.1.dist-info/WHEEL
  spam-0.1.dist-info/metadata.json
  spam-0.1.dist-info/top_level.txt

Обратите внимание, что путь, который должен быть абсолютным, относится кLocation реж. В примере.my_config будет помещен под/Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages/Users/hoefling/.my_config.

Это становится еще лучше, потому что эти встроенные колеса кэшируются на вашем диске, так что в следующий раз вы переустановите пакет, и встроенное колесо все еще существует вpipКеш, он будет использоваться для установки, и вы даже не увидите упоминаний о создании колеса в журнале терминала.

Нет реального решения, чтобы избежать этого. Самый приличный обходной путь, который я нашел, - это запретить «бинарные» пакеты при установке, чтобы обеспечить выполнение пакетов.setup.py по установке:

$ pip install spam-0.1.tar.gz --no-binary=spam
Processing ./spam-0.1.tar.gz
Skipping bdist_wheel for spam, due to binaries being disabled for it.
Installing collected packages: spam
  Running setup.py install for spam ... done
Successfully installed spam-0.1

Файл теперь размещен правильно:

$ pip show -f spam
Name: spam
Version: 0.1
...
Location: /Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages
Requires: 
Files:
  ../../../../../.my_config
  spam-0.1-py3.6.egg-info/PKG-INFO
  spam-0.1-py3.6.egg-info/SOURCES.txt
  spam-0.1-py3.6.egg-info/dependency_links.txt
  spam-0.1-py3.6.egg-info/top_level.txt

К сожалению, пользователь должен быть отдельно проинформирован о звонкеpip install с дополнительным ключом (через readme, FAQ на веб-странице и т. п.), поскольку нет возможности запретить создание колеса в метаданных пакета.

В результате я больше не включаю файлы с абсолютными путями. Вместо этого я устанавливаю их с исходниками Python вsite-packages реж. В коде Python я должен добавить дополнительную логику для проверки существования и копирования файла, если это необходимо:

# program entrypoint

if __name__ == '__main__':
    config = os.path.join(os.path.expanduser('~'), '.my_config')
    if not os.path.exists(config):
        shutil.copyfile('.my_config', config)
    main.run()
 Robert20 сент. 2018 г., 10:01
Это действительно хороший ответ, и мне интересно, почему так мало людей сталкиваются с этой проблемой. Это потому, что так мало автора пакета?
 Xophmeister24 нояб. 2017 г., 11:50
Спасибо: я думал, что добавление проверочной логики в сценарий будет на самом деле безопаснее, еслиpip делает неправильные вещи при обновлении и перезаписывает любой существующий файл точек.

Ваш ответ на вопрос