Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python运行时出现wkhtmltopdf SEGFULT_Python_Subprocess_Openerp_Wkhtmltopdf_Odoo - Fatal编程技术网

从python运行时出现wkhtmltopdf SEGFULT

从python运行时出现wkhtmltopdf SEGFULT,python,subprocess,openerp,wkhtmltopdf,odoo,Python,Subprocess,Openerp,Wkhtmltopdf,Odoo,我必须使用subprocess.call(…)从python运行wkhtmltopdf。从命令行中,我可以毫无问题地生成pdf,但是当它从python运行时,它会出现一个segfault 我不知道是什么导致了故障 我甚至尝试发送我的终端env属性,但它仍然存在故障。我发送了stderr、stdin、stdout,但没有任何效果。让我担心的是,它是从终端运行的,而不是从python运行的 此外,在python中从不同的进程调用该进程也会使其出错。例如,我在两者之间添加了一个脚本来调用这个应用程序,

我必须使用subprocess.call(…)从python运行
wkhtmltopdf
。从命令行中,我可以毫无问题地生成pdf,但是当它从python运行时,它会出现一个segfault

我不知道是什么导致了故障

我甚至尝试发送我的终端
env
属性,但它仍然存在故障。我发送了stderr、stdin、stdout,但没有任何效果。让我担心的是,它是从终端运行的,而不是从python运行的

此外,在python中从不同的进程调用该进程也会使其出错。例如,我在两者之间添加了一个脚本来调用这个应用程序,而用python编写的脚本也从wkhtmltopdf接收一个segfault

#!/bin/env python
import subprocess
import sys
import pdb
import os


sys.argv[0] = "/usr/local/bin/wkhtmltopdf.b"

sys.argv.remove('--quiet')

status = subprocess.call(sys.argv,
    env=env,
    stdin=sys.stdin,
    stdout=open("/tmp/stdout.w", "w"),
    stderr=open("/tmp/stderr.w", "w"))

cmd = " ".join(sys.argv)

pdb.set_trace()
现在我这样做是为了让我有时间在外部终端上执行命令。OpenErp正在检查pdf文件的内容
wkhtmltopdf.b
是原始二进制文件。我删除了quiet参数,因为我想看看发生了什么

显然,此时此刻:

Loading pages (1/6)
[======>                                                     ] 10%
没有别的了

我的wkhtmltopdf amd64静态版本来自wkhtmltopdf.org网站

$ wkhtmltopdf -V
wkhtmltopdf 0.12.1 (with patched qt)
我正在gentoo盒上运行一个ubuntu amd64二进制软件包。在gentoo上使用修补的qt编译wkhtmltopdf有点难/长。默认情况下,它似乎不受支持。然而,由于它是从命令行运行的,所以它也应该从python运行

我是从zsh运行它的,但即使在python程序中,我也会调用类似这样的东西:

'/bin/sh -c "%s"' % command

它也会出错。

我的问题与您的问题完全相同,但运行的堆栈不同(Apache和PHP),但我不能100%确定您实际上是如何启动python的。无论如何,它和您的完全在同一个地方崩溃,并且在命令行中运行良好,因此我想它可能值得共享,以防对任何人有所帮助;)


当通过apache和shell运行时,我发现我的问题是ulimit集不同。具体来说,我的“虚拟内存”ulimit-v相当低。最后我做了$cmd=“ulimit-v 1073741824;{$this->wkhtmltopf_path}…”这就解决了我的问题!(您可以通过运行ulimit-a进行检查,并比较shell上相同命令的值!)

尝试通过stdin传递HTML字符串。下面是一个下载响应后的示例

from subprocess import Popen, PIPE, STDOUT
from django.core.files.temp import NamedTemporaryFile
from django.template.loader import render_to_string
from django.http import HttpResponse

tmp = NamedTemporaryFile()
html = render_to_string('your-template.html', context)
p = Popen(['wkhtmltopdf', '-', tmp.name], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
out, err = p.communicate(input=(html + u'\n').encode('utf-8'))
# check for errors in 'out' and 'err' -- print out, err
with open(tmp.name, 'r') as pdf:
    pdfcontent = pdf.read()
response = HttpResponse(pdfcontent, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=print.pdf'
response['Content-Length'] = len(pdfcontent)
return response

您必须在模板中使用完整的静态URL,以防止
wkhtmltopdf
找不到静态CSS和JS文件。

Python的子流程启动一个新的shell,它可能不会继承一些shell设置和环境变量。例如,您可以在命令行上有一个
LD_LIBRARY_路径
,指向
wkhtmltopdf
使用的较新库,而在通过
子流程启动时,该路径不存在,因此
wkhtmltopdf
会返回到较旧的库,从而导致错误。请尝试搜索一个或多个shell/环境变量,这些变量会导致
wkhtmltopdf
在命令行上正常运行。@尽管我想到了这一点。我用终端的
env
结果更新了
env
目录。我把它剥掉了,因为它很大。但是env与我的终端中的相同。只是为了再次检查,当从cmdline或从子流程运行时,打印出您的环境。您能列出您的Python版本、操作系统、shell类型和版本以及wkhtmltopdf版本吗?我必须尝试一下。好的,在我的情况下不能说这是100%正确的,因为ulimit在odoo中不会有任何影响。。。但我改变了控制内存使用的参数,并将ulimit设置为1gb以上的ram,从而解决了这个问题。