[英]Printing to NamedTemporaryFile on Windows
原始问题-MCVE
以下脚本应使用无头的chrome来打印为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
的强制。 通常,将CHROME_PATH
subprocess
CHROME_PATH
(也在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)
对我不满意,但是有很好的工作机会。
事实证明,子进程无法正常运行的原因是,当python在Windows中创建NamedTemporaryFile时,它将使用FILE_SHARE_DELETE标记来执行此操作,该标记会阻止任何其他进程访问它,除非它也具有此标记。 还有就是这更多的讨论在这里 。
幸运的是,Django附带了自己的NamedTemporaryFile ,可以部分解决此问题,并且在这些目的上做得足够好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.