скрипт python для вызова самого себя с помощью xvfb

Я написал сценарий, который генерирует филогенетическое дерево с помощью пакета ete3, сценарий запускается на автономном сервере, поэтому он должен запускаться с помощью xvfb-run ( согласно здесь).

Я настроил сценарий для проверки (с помощью системного вызова ps), был ли он вызван с помощью xvfb. В случае, когда скрипт python запускается без xvfb-run (например, python script.py...), есть ли для меня простой способ убить процесс и повторно запустить его правильно (например, xvfb-run python script.py...) из исходного вызова скрипта?

Я пробовал что-то взломать вместе с os.system() вызовами ps, но мне не очень повезло. У кого-нибудь есть предложения?


person Constantino    schedule 01.06.2016    source источник


Ответы (1)


Мне удалось кое-что собрать, просто добавьте функцию check_xvfb() в начало вашего скрипта.

def check_xvfb():
    """
    Use of the ete3 library from the command line requires an X11 server
    which doesn't exist on this headless Ubuntu server.  One way around this
    is to use xvfb-run.  This function checks that the script was properly
    launched with xvfb-run; if not, it will relaunch it (with the same options)
    and then terminate the previously called script
                                                                                                                                           Parameters
    ----------                                                                                                                             none

    Returns
    -------
    none

    """

    # CHECK IF SCRIPT PROPERLY LAUNCHED
    # see http://stackoverflow.com/a/6550543/1153897 for explanation of 'cat'
    # grep -v ignores the ps -ef call since it'll match itself
    comm = 'ps -ef | grep xvfb-run | grep %s | grep -v grep | cat' %os.path.splitext(os.path.basename(sys.argv[0]))[0]
    output = subprocess.check_output(comm, shell=True)

    if not len(output): # script not called properly
        print 'script not called properly, retrying...'
        comm_run = 'xvfb-run ' + ' '.join(sys.argv)
        os.system(comm_run) # properly call script
        sys.exit(0)
    else:
        print 'script called properly!'
person Constantino    schedule 08.06.2016