Oleg Vinnyk
Oleg Vinnyk

Reputation: 13

List of commands with Popen

Hi guys,

I have three commands for copy/paste the folder with a similar path. I using this code:

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

But for the copy/paste three folders, I should three times run code. Could you help me with these guys?

Thank you!

Upvotes: 0

Views: 538

Answers (1)

hostingutilities.com
hostingutilities.com

Reputation: 9519

Do:

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
        

When passing a list into Popen or any of the other subprocess functions, you're not able to pass multiple commands in the cmd_list. It is expected that the first item in the list is the command you are running, and everything else are parameters for that one command. This restriction helps keep your code safer, especially when using user supplied input.

Another options is you can join everything together into a single command with a double ampersand. When doing so if one command fails the remaining commands won't run.

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

)

Upvotes: 3

Related Questions