подпроцесс python не запускает phantomjs, но работает в командной строке linux - PullRequest
0 голосов
/ 21 февраля 2019

когда я запускаю это на сервере CENTOS 7, оно работает из bash:

[myserver]$ /home/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /home/phantomjs-2.1.1-linux-x86_64/bin/thumbnails.js -3933029 91 q5975 "http://mysite/explore?viz=summary_slider"
Rendered 'http://mysite/explore?viz=summary_slider' at '/home/thumbnails/th-3933029c91q5975.png'

Но если я делаю это в python, используя подпроцесс, я получаю ошибку:

import subprocess
phantomjs_call = u'{0}phantomjs {0}thumbnails.js {1}'.format(phantomjspath, link)
rendered = subprocess.check_output(phantomjs_call.split())

возвращает

/home/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /home/phantomjs-2.1.1-linux-x86_64/bin/thumbnails.js "http://mysite/explore?viz=summary_checkbox"
Unable to render '"http://mysite/explore?viz=summary_checkbox"'

Есть ли что-то странное в аргументах подпроцесса?или оболочка среды не подходит?

Затем я настроил ее и передал полную строку в качестве одного аргумента, затем получил OSError:

rendered = subprocess.check_output(phantomjs_call)
# didn't split this into multiple arguments
>>>[Errno 2] no such file or directory"

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Итак, после попытки многих различных вариантов subprocess, это то, что работало с phantomjs: subprocess32 !!!

    import subprocess32 # not the default version; this supports timeouts
    for (_id, link) in link_list:        
        phantomjs_call = u'{0}phantomjs {0}thumbnails.js {1} {2} {3} {4}'.format(phantomjspath, _id, link)
        """note: this generates a string like
/home/phantomjs-2.1.1-linux-x86_64/bin/phantomjs 
/home/phantomjs-2.1.1-linux-x86_64/bin/thumbnails.js 51514 
"http://mysite/explore?viz=summary_text"
        """
        try:
            process = subprocess32.Popen(phantomjs_call, shell=True, stdout=subprocess32.PIPE)
            # make sure phantomjs has time to download/process all the pages in the list
            # but if we get nothing after 180 sec, just move on
        except Exception as e:
            print(phantomjs_call)
            print('Popen failed', e)

        try:
            output, errors = process.communicate(timeout=180)
        except Exception as e:
            if debug == True: 
                print("\t\tException: %s" % e)
            process.kill()
            return "\t\tException: {0}".format(e)
        # output will be weird, decode to utf-8 to save heartache
        phantom_output = []
        for out_line in output.splitlines():
            phantom_output.append( out_line.decode('utf-8') )

Это python2.7 - вероятно, легче вpython3, но сохранил его здесь, потому что мне потребовалось много проб и ошибок, чтобы заставить subprocess32 работать с phantomjs.

Также - я не поделился файлом thumnails.js, но это javascript, который анализирует входные данные командной строкив phantomjs для столько URL-адресов, сколько вы хотите, и создает имена файлов, используя эти параметры.

0 голосов
/ 21 февраля 2019

Как насчет этого

import subprocess
phantomjs_call = '{0}phantomjs {0}thumbnails.js {1}'.format(phantomjspath, link)
print(subprocess.check_output(phantomjs_call), shell=True)

или

import os
phantomjs_call = '{0}phantomjs {0}thumbnails.js {1}'.format(phantomjspath, link)
print(os.system(phantomjs_call))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...