我最近遇到了一个奇怪的情况,我想将我(正确格式化的)Python软件包coolpackage
转换为tarball,以便简单分发给某些同事,但是最终tarball的有效性取决于以前使用的操作系统生成它。
对于上下文,可以在MacOS和Ubuntu Linux上通过coolpackage
从源目录安装pip
,而不会出现问题:
cd coolpackage
pip install .
这在macOS和Linux上均有效,并且在两种情况下都在conda
环境中运行,该环境在软件包方面完全相同。
现在,如果我在Ubuntu中生成了tarball
# run inside Ubuntu 18.04
tar -czvf coolpackage.tar.gz coolpackage
然后可以使用pip在MacOS和Ubuntu上安装tar.gz
文件:
pip install coolpackage.tar.gz
但是,如果我在macOS中生成了tarball
# run inside macOS Mojave
tar -czvf coolpackage.tar.gz coolpackage
那个 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.
想知道以前是否有人遇到过这种情况,或者对可能发生的事情有任何想法?我可以通过在Linux中进行构建来避免这种情况,所以这不是直接的问题,但是我不喜欢不理解为什么为什么失败。
答案 0 :(得分:2)
tar
的各种方言/风格在很大程度上相似。在这种情况下,我们要研究Linux系统上常用的GNU工具和BSD上使用的BSD工具(-> Darwin-> MacOS X)。
如果要在Linux上运行BSD tar,请尝试bsdtar
;如果要在BSD(以及某些其他U * X系统)上使用GNU tar,请尝试gtar
。
这也转化为其他的tarball使用者,似乎是pip
的旅行,显然希望使用GNU版本(gtar
)来调味输入。
答案 1 :(得分:1)
由于您使用的是Python,因此直接在其标准库中使用python -m tarfile
和python -m gzip
是一个好主意。它应该足够便携。
此外,假设项目是使用 setuptools (或 distutils )打包的,那么在大多数情况下直接使用 sdist 应该就足够了( python setup.py sdist
。