Popen的命令列表

问题描述

大家好,

我有三个命令用于复制/粘贴路径相似的文件夹。我使用以下代码

        from subprocess import Popen,PIPE        


        cmd_list = [
            'cp -r /opt/some_folder_1/ /home/user_name/','cp -r /var/some_folder_2/ /home/user_name/','cp -r /etc/some_folder_3/ /home/user_name/',]
            copy_paste = Popen(
            cmd_list,shell = True,stdin = PIPE,stdout = PIPE,stderr = PIPE

        )

            stdout,stderr = make_copy.communicate()

但是对于复制/粘贴三个文件夹,我应该运行三次代码。 你能帮我这些家伙吗?

谢谢!

解决方法

要做:

import subprocess       


cmd_list = [
    ['cp','-r','/opt/some_folder_1/','/home/user_name/'],['cp','/var/some_folder_2/','/etc/some_folder_3/',]
for cmd in cmd_list:
    res = subprocess.check_output(cmd)
    # stdout and stderr are available at res.stdout and res.stderr
    # An error is raised for non-zero return codes
        

将列表传递到Popen或任何其他子流程函数中时,您将无法在cmd_list中传递多个命令。期望列表中的第一项是您正在运行的命令,其他所有内容都是该命令的参数。此限制有助于使代码更安全,尤其是在使用用户提供的输入时。

另一个选择是,您可以将所有内容连为一个带有双“&”号的命令。这样做时,如果一个命令失败,则其余命令将无法运行。

copy_paste = Popen(
    ' && '.join(cmd_list),shell = True,stdin = PIPE,stdout = PIPE,stderr = PIPE

)