【问题标题】:List of commands with Popen带有 Popen 的命令列表
【发布时间】:2020-11-11 17:30:42
【问题描述】:

大家好,

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

        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()

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

谢谢!

【问题讨论】:

  • 您能更具体地说明您想要做什么吗?复制三个文件不需要运行三倍的代码,因为您可以通过将 cmd_list 传递给单个 Popen 来执行此操作。
  • @Nastor “通过将 cmd_list 传递给它的单个 Popen”已经正是他正在做的事情。
  • 嗨,@Nastor!我想尝试在我的代码中使用子进程,我想知道是否可以通过命令列表使用子进程

标签: python python-3.x subprocess popen


【解决方案1】:

做:

import subprocess       


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/'],
]
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

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2012-02-25
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多