【问题标题】:"int() argument must be a string" from int(p.returncode) with subprocess.Popen object“int() 参数必须是字符串”,来自 int(p.returncode) 和 subprocess.Popen 对象
【发布时间】:2020-04-10 20:37:31
【问题描述】:

我正在开发一个 Python 3 程序,通过 rsync 远程文件夹备份到本地 NAS。

我完美地同步了文件夹,但是当我想通过 .tar.gz 将文件夹压缩成一个文件时,我收到了这个错误:

int() argument must be a string, a bytes-like object or a number, not 'NoneType'
tar: Removing leading `/' from member names
file changed as we read it
tar: write error

生成压缩文件的函数是这个:

def make_tarfile(self, output_filename, source_dir):
    try:
        # Generate .tar.gz
        print("Generating .tar.gz backup")
        tar_args = ['tar', '-cvzf', source_dir+output_filename+'.tar.gz', source_dir]
        process = subprocess.Popen(
                tar_args,
                stdout=subprocess.PIPE
            )
        if int(process.returncode) != 0:
            print('Command failed. Return code : {}'.format(process.returncode))
        print("OK.")

        # Remove files
        print("Removing files previously compressed.")
        remove_args = ['find', source_dir, '-type f', '!', '-name "*.?*"', '-delete']
        process = subprocess.Popen(
                remove_args,
                stdout=subprocess.PIPE
            )
        print("OK.")
        if int(process.returncode) != 0:
            print('Command failed. Return code : {}'.format(process.returncode))
    except Exception as e:
        print(e)
        exit(1)

如果我用 bash 编写命令似乎可以工作。

【问题讨论】:

  • 使用subprocess.run 而不是subprocess.Popen。它等待命令完成。
  • process.returncode 在软件完成运行之前不会设置。
  • 在您的问题以最初提出的正确方式得到回答后,以使现有答案无效的方式进行编辑是不道德的。遇到新问题时提出新问题。
  • 也就是说,'-type f' 必须是 '-type', 'f'
  • 同样,'-name "*.?*"' 应该是 '-name', '*.?*'

标签: python-3.x bash subprocess tar


【解决方案1】:

创建一个新的subprocess.Popen 对象启动一个进程。它不会等待它完成,并且未完成的进程不存在returncode

等待 Popen 对象完成的历史方法是在其上调用 wait() 函数。您也可以改用 subprocess.run,或其他一些帮助程序,例如 communicate(),它本身会隐式等待完成。

【讨论】:

  • 嗨,查尔斯,我已经编辑了我的问题。我尝试运行,但我得到“tar:从成员名称中删除前导 `/'”以及“tar:/backup/rsync/equipelectronics.com/11-04-2020/01\:12\:50:文件已更改当我们读到它时”。
  • 这两条消息都是完全正常的,和Python完全没有关系。
  • 他们的意思和他们所说的完全一样:tar从文件名中删除前导/s是正常的(并在这样做时写一个警告),而tar写一个警告是正常的当它正在归档的文件在其下发生更改时到 stderr。这些都是警告,而不是错误
  • ...为避免第二个问题,最佳实践是使用您的文件系统或底层块设备层提供的任何快照类型机制来获取即时的稳定映像,并创建备份关闭该图像。不过,这远远超出了这个问题的范围(您是否可能完全取决于一堆操​​作系统和文件系统设置/配置细节)。
  • 我明白你的意思,但如果 .tar.gz 已正确创建,则不会出现“命令失败。返回码:1”,它会是 0。当我打开带有 WinRar 的 .tar.gz 说它已损坏,如果我打开它,这里只有一些文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多