最初的问题-MCVE
下面的脚本应该使用chrome headless打印成pdf(我运行的是windows 10和python 3.6):
import subprocess
from tempfile import NamedTemporaryFile
output = NamedTemporaryFile()
CHROME_PATH=r'"C:\Program Files (x86)\Google\Chrome\Application\chrome"'
chrome_args=[CHROME_PATH,
'--headless',
r'--print-to-pdf="{}"'.format(output.name),
'--disable-gpu',
'https://www.google.com/',]
subprocess.call(chrome_args,shell=True)
然而,生成的文件只是空的。
尝试调试
为了弄清楚发生了什么,我将脚本改编为以下内容:
import subprocess
CHROME_PATH=r'"C:\Program Files (x86)\Google\Chrome\Application\chrome"'
chrome_args=[CHROME_PATH,
'--headless',
r'--print-to-pdf="c:\Users\timmc\Documents\output.pdf"',
'--disable-gpu',
'https://www.google.com/',]
print(r" ".join(chrome_args)) #For debuging
subprocess.call(chrome_args,shell=True)
在这种情况下,在预期的位置没有生成文件。打印结果为:
"C:\Program Files (x86)\Google\Chrome\Application\chrome" --headless --print-to-pdf="c:\Users\timmc\Documents\output.pdf" --disable-gpu https://www.google.com/
如果我运行以下命令(创建一个原始字符串文本),所有操作都将按预期工作,并生成文件。
subprocess.call(r'"C:\Program Files (x86)\Google\Chrome\Application\chrome" --headless --print-to-pdf="c:\Users\timmc\Documents\output.pdf" --disable-gpu https://www.google.com/', shell=True)
在堆栈溢出上到处搜索,并尝试了一些事情之后,我仍然无法使原始脚本正常工作。有什么想法吗?
部分问题是,我似乎无法从子流程调用中获得任何有意义的调试。我们也非常感谢您的帮助。
最佳答案
我会尽量回答而不是一次又一次的评论,但显然我不能测试这个。
问题主要是双引号的强制&shell=True
。将引号留给subprocess
(也在CHROME_PATH
中)和拆分参数通常可以正常工作。我用这种技术解决了很多问题。
由于您的注释指出它没有,并且您找到了一个解决方法,所以让我建议对此解决方法进行改进:在命令行中插入有效的输出文件名:
subprocess.call(r'"C:\Program Files (x86)\Google\Chrome\Application\chrome" --headless --print-to-pdf="{}" --disable-gpu https://www.google.com/'.format(output.name), shell=True)
我不满意,但它有一个很好的工作机会。