1

这里有一个小众场景,要直接测试,你需要 wkhtmltopdf(在这种情况下监听端口 7000 w/--read-args-from-stdin)作为守护进程运行(以及手头上一个方便的 html 文件) .)

如果我做:

echo "-s letter -T 24mm -R 24mm -B 0mm -g ~/my.html /tmp/my.pdf" | nc localhost 7000

然后很快弹出 /tmp/my.pdf ...我可以连续执行 25 次,并获得与分别向上和向下旋转 wkhtmltopdf 25 次一样多的结果。

Walp,这意味着我需要能够从我们自己的排队等待守护进程中调用 THIS,此外,我必须等待它完成,然后再检查结果是否存在并相应地勾选成功或失败。

我找到了 subprocess.call,但由于未指定的原因,它无法正常工作......也就是说,从 python 提示符:

call(['echo', '\"-s letter -T 24mm -R 24mm -B 0mm -g ~/my.html /tmp/my1.pdf\"', '|', 'nc', 'localhost', '7000'])

我得到:

"-s letter -T 24mm -R 24mm -B 0mm -g ~my.html /tmp/my1.pdf" | nc localhost 7000
0

0 表明它认为它是成功的......但是,与我从 bash 本身执行相同语句时不同,wkhtmltopdf 守护进程没有任何结果。我尝试在其中添加一个额外的“echo”,因为打印输出不包含它,但结果相同。

所以......不知何故,这与直接输入 bash 提示符时所做的事情不同。

想法?专业知识?

谢谢!

4

1 回答 1

1

要解决您的问题,调用echonc通过 shell 是一种可行但不切实际的方法。

相反,我会做

def call_7000(*a):
    import socket
    s = socket.create_connection(('localhost', 7000))
    s.write(" ".join(str(i) for i in a)
    s.close()

你现在可以称之为

call_7000("-s letter -T 24mm -R 24mm -B 0mm -g ~my.html /tmp/my1.pdf")

或作为

(除了我不知道“~/my.html”是否有效;也许你应该这样做os.expanduser('~/my.html')。)

你甚至可以做

def call_7000(*args, **kwargs):
    import socket
    import itertools
    s = socket.create_connection(('localhost', 7000))
    items = itertools.chain(" ".join("-%s %s" % (k, v) for k, v in kwargs), a)
    s.write(" ".join(str(i) for i in items)
    s.close()

并调用它

call_7000("/tmp/my1.pdf", s="letter", T="24mm", R="24mm", B="0mm", g="~/my.html")

如果选项的顺序不相关。

于 2013-10-26T07:10:30.367 回答