Запуск Chrome без головы из Python

Я пытаюсь использовать хромированный безголовый принтер для печати в PDF. Я использую командную строку Windows 10. Если я сделаю следующее, все будет работать должным образом:

cd "C:\Program Files (x86)\Google\Chrome\Application"

chrome --headless --print-to-pdf=c:\Users\timmc\Documents\a.pdf --disable-gpu https://www.google.com/

Однако в конечном итоге я хочу запустить эту команду из сценария python, используя subprocess.call (), и пробелы в «Program Files (x86)», похоже, вызывают проблемы. Я просмотрел другие ответы о переполнении стека, но не нашел ничего, что работает. Если я попробую следующее:

C:\"Program Files (x86)"\Google\Chrome\Application\chrome --headless --print-to-pdf=c:\Users\timmc\Documents\b.pdf --disable-gpu https://www.google.com/

Я получаю очень необычное поведение, когда Google открывается, но не в режиме без головы, он открывает две вкладки, одну с Google, а другую пытается открыть что-то вроде программы% 20 - original-process-start-time% 3D13156438844432514% 20-- быстрый старт% 20files% 20% 28x86% 29.

Может ли кто-нибудь объяснить вышеуказанное поведение?

Есть ли простой способ справиться с пробелами, который будет работать в сценарии Python с использованием subprocess.call ()?

Есть ли альтернативный способ добиться того же? (Я бы предпочел не использовать селен, а напрямую использовать хром без головы).

РЕДАКТИРОВАТЬ: код, который я в конечном итоге надеюсь запустить из моего скрипта python:

subprocess.call('C:\"Program Files (x86)"\Google\Chrome\Application\chrome --headless --print-to-pdf=c:\Users\timmc\Documents\b.pdf --disable-gpu https://www.google.com/',shell=True)

person tim-mccurrach    schedule 29.11.2017    source источник
comment
Вы заставляете нас угадывать, каков ваш реальный код, и вам становится труднее помочь.   -  person John Gordon    schedule 29.11.2017
comment
Спасибо, я отредактировал сообщение, включив в него фактический код. Если мне нужно добавить что-нибудь еще, скажите, пожалуйста.   -  person tim-mccurrach    schedule 29.11.2017


Ответы (1)


Я не использую Windows, поэтому я не могу провести для вас тестирование, но, вероятно, могу указать вам правильное направление.

Во-первых, лучше использовать список параметров для call вместо большой строки. Например, subprocess.call(["echo", "one", "two"]) вместо subprocess.call("echo", "one two"). Поступая так, вам не нужно так сильно беспокоиться о цитировании, поскольку каждый параметр для .call должен интерпретироваться как отдельный параметр для chrome, даже если они содержат пробелы.

Кроме того, в нижней части документации есть информация о том, как интерпретация строки командной строки происходит в Windows: subprocess.call (["ls", "-l"])

17.1.5.1. Преобразование последовательности аргументов в строку в Windows В Windows последовательность аргументов преобразуется в строку, которая может быть проанализирована с использованием следующих правил (которые соответствуют правилам, используемым средой выполнения MS C):

Аргументы разделяются пробелом, который является либо пробелом, либо табуляцией. Строка, заключенная в двойные кавычки, интерпретируется как единственный аргумент, независимо от того, какие пробелы содержатся внутри. Строка в кавычках может быть встроена в аргумент. Двойные кавычки, которым предшествует обратная косая черта, интерпретируются как буквальные двойные кавычки. Обратные косые черты интерпретируются буквально, если они не ставятся непосредственно перед двойными кавычками. Если обратная косая черта непосредственно предшествует двойным кавычкам, каждая пара обратных косых черт интерпретируется как буквальная обратная косая черта. Если количество обратных косых черт нечетное, последняя обратная косая черта экранирует следующую двойную кавычку, как описано в правиле 3.

https://docs.python.org/2/library/subprocess.html#converting-argument-sequence

person Cargo23    schedule 29.11.2017
comment
Спасибо, это очень полезно, теперь я пробовал использовать список вместо большой строки, однако обнаружил, что теперь получаю некоторые ошибки, я думаю, из-за кодировки и того факта, что мой выходной каталог должен находиться в c : \ Users \ ... the \ U - это, я думаю, проблема, которая вызвала мою первоначальную проблему, поэтому я начну новый вопрос о кодировании. - person tim-mccurrach; 30.11.2017
comment
Но выполнение того, что вы предложили, определенно решило проблему пробелов в «программных файлах». - person tim-mccurrach; 30.11.2017