2013-05-23 2 views
0

Я пытаюсь выполнить xvfb-run через py.sh, но я получаю sh.ErrorReturnCode_1 и не создавая в результате PDF.sh.py не выполняется xvfb-run

Я создал небольшой HTML-файл:

$ echo '<h1>Hello, World.</h1>' > test.html 

И я побежал xvfb_run через sh.py в Python:

$ python 
Python 2.7.3 (default, Sep 26 2012, 21:51:14) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from sh import xvfb_run 
>>> xvfb_run('--server-num=1 --server-args="-screen 0, 1024x768x24" ' 
...  '/usr/bin/wkhtmltopdf --ignore-load-errors', 'test.html', 'test.pdf') 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "/home/mark/.virtualenvs/reports/local/lib/python2.7/site-packages/sh.py", line 726, in __call__ 
    return RunningCommand(cmd, call_args, stdin, stdout, stderr) 
    File "/home/mark/.virtualenvs/reports/local/lib/python2.7/site-packages/sh.py", line 291, in __init__ 
    self.wait() 
    File "/home/mark/.virtualenvs/reports/local/lib/python2.7/site-packages/sh.py", line 295, in wait 
    self._handle_exit_code(self.process.wait()) 
    File "/home/mark/.virtualenvs/reports/local/lib/python2.7/site-packages/sh.py", line 309, in _handle_exit_code 
    self.process.stderr 
sh.ErrorReturnCode_1: 

    RAN: '/usr/bin/xvfb-run --server-num=1 --server-args="-screen 0, 1024x768x24" /usr/bin/wkhtmltopdf --ignore-load-errors test.html test.pdf' 

    STDOUT: 


    STDERR: 

я затем проверить обратно в оболочке, чтобы увидеть, если что-то было создал и ничего не имеет:

$ ls -l 
total 4 
-rw-rw-r-- 1 mark mark 23 May 22 07:54 test.html 

Так я тогда выписывать в xvfb-run команда сверху и она отлично работает:

$ /usr/bin/xvfb-run --server-num=1 --server-args="-screen 0, 1024x768x24" /usr/bin/wkhtmltopdf --ignore-load-errors test.html test.pdf 
Loading page (1/2) 
Printing pages (2/2)            
Done               

И есть файл PDF я пытаюсь создать:

$ ls -l 
total 12 
-rw-rw-r-- 1 mark mark 23 May 22 07:54 test.html 
-rw-rw-r-- 1 mark mark 7091 May 22 07:55 test.pdf 

Затем я попытался с помощью метода call из стандартной библиотеки:

>>> from subprocess import call 
>>> call(['/usr/bin/xvfb-run', '--server-num=1', '--server-args="-screen 0, 1024x768x24"', '/usr/bin/wkhtmltopdf', '--ignore-load-errors', 'test.html', 'test.pdf']) 
xvfb-run: error: Xvfb failed to start 
1 

Я тогда подумал, что среда окружения DISPLAY не установлена, но я не испытываю никакой радости от этого:

>>> import os 
>>> os.environ["DISPLAY"]=":99" 
>>> call(['/usr/bin/xvfb-run', '--server-num=1', '--server-args="-screen 0, 1024x768x24"', '/usr/bin/wkhtmltopdf', '--ignore-load-errors', 'test.html', 'test.pdf']) 
xvfb-run: error: Xvfb failed to start 
1 

>>> call(['/usr/bin/wkhtmltopdf', '--ignore-load-errors', 'test.html', 'test.pdf']) 
wkhtmltopdf: cannot connect to X server :99 
1 

>>> os.environ["DISPLAY"]=":1" 
>>> call(['/usr/bin/wkhtmltopdf', '--ignore-load-errors', 'test.html', 'test.pdf']) 
wkhtmltopdf: cannot connect to X server :1 

Любая идея, почему py.sh и call не смогли выполнить эту команду? Здесь что-то не хватает?

ответ

0

Мне нужно было запустить /usr/bin/Xvfb :1 -screen 0 1024x768x24 отдельно и держать его в рабочем состоянии. Тогда не было необходимости в xvfb-run, я мог бы выполнить wkhtmltopdf без помощи.

>>> import os 
>>> os.environ["DISPLAY"]=":1" 
>>> from sh import wkhtmltopdf 
>>> wkhtmltopdf('--ignore-load-errors', 'test.html', 'test.pdf')