Экранирование строковых аргументов для вызовов подпроцессов в Windows

Почему Example one копирует hello world в буфер обмена, а Example two нет?

# Example one
subprocess.check_output(["echo", "hello world", "|", "clip"], shell=True, stderr=subprocess.STDOUT)

# Example two
subprocess.check_output(["echo", "hello \n world", "|", "clip"], shell=True, stderr=subprocess.STDOUT)

Другая проблема заключается в том, что Example one копирует hello world с кавычками вокруг него, например:

"hello world"

Итак, как мне скопировать текст с несколькими строками в буфер обмена без двойных кавычек?


person Gezim    schedule 28.04.2015    source источник
comment
Я не знаю, почему вы хотите использовать для этого оболочку cmd; это головная боль. Вы можете просто использовать p = Popen('clip.exe', stdin=PIPE, stdout=PIPE, universal_newlines=True); p.communicate('hello\nworld'); p.wait().   -  person Eryk Sun    schedule 28.04.2015
comment
@eryksun, почему ты не ответил?! У меня нет любви к оболочке cmd. Мне нужно, чтобы это работало.   -  person Gezim    schedule 28.04.2015
comment
Я не столько отвечал на вопрос, сколько избегал его. Всякий раз, когда я думаю, что знаю, как cmd.exe будет анализировать командную строку, я обжигаюсь.   -  person Eryk Sun    schedule 28.04.2015


Ответы (2)


Как предложил @eryksun, это решает проблему:

p = subprocess.Popen('clip.exe', stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True)
p.communicate('hello \n world')
p.wait()
person Gezim    schedule 28.04.2015

Я подозреваю, что это потому, что вы используете shell=True, реорганизуйте свой код, чтобы не использовать его.

Но я бы предложил вообще отказаться от этого подхода и использовать pyperclip для поддержки буфера обмена. Он кроссплатформенный и находится в свободном доступе.

person orlp    schedule 28.04.2015
comment
Нет, это вообще не работает. FileNotFoundError: [WinError 2] The system cannot find the file specified - person Gezim; 28.04.2015