【问题标题】:Python subprocess module sending path as stringPython子进程模块将路径作为字符串发送
【发布时间】:2019-10-02 14:26:45
【问题描述】:

我正在从 Python 3 脚本压缩一个文件夹。

我通常在终端中使用并且它有效的命令是

zip -P P4ssw0rd somefolder.zip somefolder/*

(-P 我用于密码加密,最后是/*,因为我想压缩文件夹的内容,如果我不包含它,存档只包含一个空文件夹)

这成功创建了一个 somefolder.zip,其中包含正确的、受密码保护的内容。

当我从我的脚本中执行这个命令时,我正在使用

subprocess.call(['zip', '-P', 'P4ssw0rd', 'somefolder.zip', 'somefolder/*'])

这给了我一个 zip 错误(如果我直接在终端中编写命令,我会得到同样的错误,但如果我拼错了文件夹名称,例如 zip -P P4ssw0rd somefolder.zip someOtherfolder/*

警告说:

zip 警告:名称不匹配:somefolder/*

据我了解,它以某种方式将 / 和 * 解释为文件夹名称的一部分,而不是我试图在文件夹内导航...

有什么想法吗?


为了让事情更混乱:

如果 somefolder.zip 已经存在,那么

subprocess.call(['zip', '-P', 'P4ssw0rd', 'somefolder.zip', 'somefolder/*'])

将执行。它说它正在更新文件夹的内容,但据我从档案本身可以看出,实际上没有任何变化。但是,如果我将 'somefolder/*' 更改为 'someOtherfolder/*' 之类的其他名称,则会再次引发名称不匹配错误。

【问题讨论】:

    标签: python python-3.x ubuntu terminal zip


    【解决方案1】:

    如果您不介意使用 subprocess 模块以外的其他东西,这可行:

    os.popen("zip -P P4ssw0rd somefolder.zip somefolder/*")
    

    当然,别忘了提前import os

    【讨论】:

    • 它并没有真正起作用。它确实创建了奇怪的文件,名称奇怪且看似空。
    • @celae “奇怪”到底是什么意思?
    • @P.Dmitry 一些具有随机无意义名称的文件。没有扩展。好像是空的
    • @celae 很奇怪。您可以尝试使用os.system 而不是os.popen 并告诉我它是否具有相同的行为吗?
    【解决方案2】:

    这可能是因为您的脚本是从不同的位置执行的。尝试传递绝对路径而不是相对路径。 例如

    subprocess.call(['zip', '-P', 'P4ssw0rd', '-j', 'somefolder.zip', '/full/path/to/somefolder/*'])
    

    【讨论】:

    • 它仍然说名称不匹配,显然现在它正在将整个内容解释为文件夹名称。
    【解决方案3】:

    您可能应该手动将 glob * 转换为文件列表

    dir = 'somefolder'
    files = [ dir + f for f in listdir(dir) ]
    cmd = ['zip', '-P', 'P4ssw0rd', 'somefolder.zip' ] + files
    subprocess.call(cmd)
    

    【讨论】:

      【解决方案4】:

      经过进一步检查,我发现@ImranD 提出的os.system() 虽然有效,但建议更换为较新的supbrocess 模块。所以确实最正确的方法是使用subprocess.call(),但是应该以不同的方式提供参数。

      例如,在我原来的问题中,使用subprocess.call() 的正确(和有效)方式如下:

      subprocess.call('zip -P P4ssw0rd somefolder.zip somefolder/*', shell=True)

      实际上,我的行看起来更像:

      subprocess.call('zip -P P4ssw0rd ' + archiveName + ' ' + folderToArchive, shell=True)

      其中archiveNamefolderToArchive 是我之前修改过的(我认为很容易解释)字符串。

      文档:

      https://docs.python.org/3.7/library/subprocess.html#replacing-older-functions-with-the-subprocess-module

      或更具体地:

      https://docs.python.org/3.7/library/subprocess.html#replacing-os-system

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2021-01-20
        • 1970-01-01
        相关资源
        最近更新 更多