Устанавливаемый пакет Python tar.gz зависит от ОС, используемой для сборки tarball - PullRequest
1 голос
/ 10 марта 2020

Недавно я столкнулся со странным сценарием, в котором я хотел преобразовать свой (правильно отформатированный) пакет Python coolpackage в тарбол для простого распространения среди некоторых коллег, однако валидность получившегося тарбола зависит от ОС, используемой для сгенерируйте его.

Для контекста, coolpackage можно установить из исходного каталога через pip на macOS и в Ubuntu Linux без проблем:

cd coolpackage
pip install .

Это работает на обоих macOS и Linux, и в обоих случаях он выполняется в среде conda, которая идентична с точки зрения пакетов.

Теперь, если я сгенерировал тарбол в Ubuntu

# run inside Ubuntu 18.04
tar -czvf coolpackage.tar.gz coolpackage

Затем этот tar.gz файл может быть установлен с помощью pip как в macOS, так и в Ubuntu:

pip install coolpackage.tar.gz

Однако, если я сгенерирую tarball в macOS

# run inside macOS Mojave
tar -czvf coolpackage.tar.gz coolpackage

That tarball не устанавливается ни в macOS, ни в Ubuntu, и в обоих случаях завершает работу с практически одинаковой ошибкой (несмотря на пути):

    pip install coolpackage.tar.gz
    Processing ./coolpackage.tar.gz
    ERROR: Command errored out with exit status 1:
     command: /Users/alex/Python/conda/envs/localconda/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/setup.py'"'"'; __file__='"'"'/private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/pip-egg-info
         cwd: /private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/
    Complete output (5 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/Users/alex/Python/conda/envs/localconda/lib/python3.7/tokenize.py", line 447, in open
        buffer = _builtin_open(filename, 'rb')
    FileNotFoundError: [Errno 2] No such file or directory: '/private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/setup.py'
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

Интересно, сталкивался ли кто-нибудь с этим ранее или вы GHTS о том, что может происходить? Я могу избежать этого, встроив Linux, поэтому это не является немедленной проблемой, но мне не нравится не понимать , почему что-то не получается.

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Существуют различные диалекты / ароматы tar, которые в значительной степени похожи. В этом случае мы рассмотрим инструменты GNU, обычно используемые в Linux системах, и инструменты BSD, используемые в BSD (-> Darwin -> MacOS X).

Если вы хотите запустить BSD tar в Linux, попробуйте bsdtar и если вы хотите использовать GNU tar в BSD (но также и в некоторых других системах U * X), ​​попробуйте gtar.

. Это также переводит на других потребителей тарболлов, и похоже, что это срабатывает pip, который, очевидно, ожидает ароматизированные входные данные версии GNU (gtar).

1 голос
/ 23 марта 2020

Поскольку вы используете Python, было бы неплохо напрямую использовать python -m tarfile и python -m gzip из стандартной библиотеки. Он должен быть достаточно переносимым.

Кроме того, если проект упакован с setuptools (или distutils ), использование sdist напрямую должно быть достаточно хорошо в большинстве случаев (python setup.py sdist).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...