Python使用tarfile.add消除'tar: Removing leading `/’'警告的方法
解决tar创建时的"Removing leading `/' from member names"警告
问题原因
这个警告是因为添加到tar包的路径包含了绝对路径前缀,或者tar解析时认为路径带了不必要的前置/,它会自动去掉这些前缀以保证tar包的可移植性。命令行里的-C参数是通过切换到目标目录再添加文件,让tar里的路径变成相对路径来避免警告。
Python实现方式
有两种简单的实现方式,对应命令行-C的效果:
方法1:正确设置arcname参数
直接在tar.add()里把arcname设为你希望在tar包中显示的路径(比如只保留目标目录名,去掉前面的./sample/前缀),这样就不会产生带前置/的路径:
import os import tarfile def create_tarball(self, dir_name): try: target_path = os.path.join("./sample", dir_name) # 把arcname设为目录名,tar里的路径就是dir_name/xxx,而非./sample/dir_name/xxx with tarfile.open("example.tar", "w:tar") as tar: tar.add(target_path, arcname=dir_name) except Exception as e: raise e
如果想把dir_name目录下的所有内容直接放到tar包根目录(对应tar -C ./sample/dir_name -cf example.tar .),可以把arcname设为.:
tar.add(target_path, arcname=".")
方法2:临时切换工作目录
模拟-C参数的核心逻辑——先切换到目标父目录,再添加文件,最后恢复原工作目录:
import os import tarfile def create_tarball(self, dir_name): try: original_dir = os.getcwd() # 切换到./sample目录,对应tar -C ./sample os.chdir("./sample") with tarfile.open(os.path.join(original_dir, "example.tar"), "w:tar") as tar: tar.add(dir_name) except Exception as e: raise e finally: # 无论成功失败,都切回原目录 os.chdir(original_dir)
原代码的问题
你原来的arcname=os.path.basename(".sample/")是错误的,.sample/的basename是空字符串,这会导致路径处理异常,也是触发警告的原因之一,修正后就能解决问题。
内容的提问来源于stack exchange,提问作者Priya Shah
相关产品推荐
相关产品推荐

