我正在尝试使用chrome headless打印到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/
但是,最终我想使用subprocess.call()和' Program Files(x86)'中的空格从python脚本运行此命令。似乎造成了麻烦。我已经查看了堆栈溢出的其他答案,但没有找到任何有效的方法。如果我尝试以下内容:
C:\"Program Files (x86)"\Google\Chrome\Application\chrome --headless --print-to-pdf=c:\Users\timmc\Documents\b.pdf --disable-gpu https://www.google.com/
我得到一些非常不寻常的行为,谷歌打开但不是无头模式,它打开两个标签,一个用谷歌,一个试图打开像程序%20 - 原始进程开始时间%3D13156438844432514% 20 - 快速启动%20files%20%28x86%29
有人可以解释上述行为吗?
是否有一种简单的方法来处理空间,这将使用subprocess.call()在python脚本中工作?
是否有其他方法可以实现同样的目标? (我宁愿不使用硒,但直接使用镀铬无头。)
编辑: 我最终希望从我的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)
答案 0 :(得分:0)
我没有运行Windows,所以我无法为您做任何测试,但我可能会指出您正确的方向。
首先,更好的做法是使用 $f = Get-Content C:\temp\abc.txt # this is the contents-file
foreach ($r in $f)
{
$r2 = (Split-Path $r).Replace("\", "\new") + '\newfile_' + [io.path]::GetFileNameWithoutExtension($r) + '.txt'
$r2 = $r2.replace(":\", ":\mynewfile\")
Get-Content $r | Out-File -filepath $r2
}
的参数列表,而不是大字符串。例如call
而不是subprocess.call(["echo", "one", "two"])
。通过这样做,您不必担心引用的问题,因为subprocess.call("echo", "one two")
的每个参数都应该被解释为.call
的单个参数,即使它们包含空格。
此外,文档底部还有一些关于命令行字符串解释如何在Windows中发生的信息:subprocess.call([" ls"," -l"])
17.1.5.1。在Windows上将参数序列转换为字符串 在Windows上,args序列转换为可以使用以下规则解析的字符串(对应于MS C运行时使用的规则):
参数由空格分隔,可以是空格或制表符。 由双引号括起的字符串被解释为单个参数,而不管其中包含的空格。带引号的字符串可以嵌入参数中。 以反斜杠开头的双引号被解释为文字双引号。 反斜杠按字面解释,除非它们紧跟在双引号之前。 如果反斜杠紧跟在双引号之前,则每对反斜杠都被解释为文字反斜杠。如果反斜杠的数量是奇数,则最后一个反斜杠会转义下一个双引号,如规则3中所述。
https://docs.python.org/2/library/subprocess.html#converting-argument-sequence