我最近遇到了一个奇怪的情况,我想将我的(正确格式化的)Python软件包coolpackage
转换为tarball,以便向某些同事进行简单分发,但是生成的tarball的有效性取决于生成它的OS。
对于上下文,可以在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
然后可以在MacOS和Ubuntu上使用pip安装tar.gz
文件:
pip install coolpackage.tar.gz
但是,如果我在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.
想知道以前是否有人遇到过这种情况,或者对可能发生的事情有任何想法?我可以通过在Linux中进行构建来避免这种情况,所以这不是一个直接的问题,但是我不喜欢不理解why某些操作失败。
tar
的各种方言/风味大体相似。在这种情况下,我们正在研究Linux系统上常用的GNU工具和BSD上使用的BSD工具(-> Darwin-> MacOS X)。
由于您正在使用Python,那么为什么不直接从其标准库中使用python -m tarfile
和python -m tarfile
?它应该足够便携。