Запустите скрипт Python из C ++, модули не найдены - PullRequest
0 голосов
/ 06 мая 2018

OSX 10.12

Я пытаюсь запустить скрипт python, который я создал изнутри c, используя вызов execlp() (в разветвленном потоке). Я могу нормально запустить скрипт через командную строку, но из приложения я получаю сообщение о том, что не могу найти модули. Я даже пытался установить модули глобально, например sudo -H pip install requests, но модули все еще не найдены. Мой скрипт на python импортирует модули как обычно:

import requests
from bs4 import BeautifulSoup

html = requests.get('https://www.douyu.com/directory/all').text
soup = BeautifulSoup(html, 'html.parser')
urls = soup.select('.play-list-link')

output = '';
output += '[' #open json array
for i, url in enumerate(urls):
    channelName = str(i);
    channelUrl = 'http://douyu.com' + url.get('href')
    output += '{'
    output += '\"channelName\":' + '\"' + channelName.encode('utf-8') + '\",'
    output += '\"channelUrl\":' + '\"' + channelUrl.encode('utf-8') + '\"'
    output += '},'

output = output[:-1] # remove last comma
output += ']' # close json array

print output

Мое выполнение из моего приложения на c ++ выглядит следующим образом (строка execlp() - это действительно все, что я здесь показываю):

int pid = fork();
switch(pid){
    case -1:{
        perror("fork");
        _exit(EXIT_FAILURE);
        break;
    }
    case 0:{ // child process

    // create output file
        int out = creat(jsonFilePath.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
        if (out == -1){ //if failed to create output file, terminate child process
            perror("creat");
            _exit(EXIT_FAILURE);
        } else {
            dup2(out,STDOUT_FILENO); // redirect stdout to output file
            execlp("python","python",pythonScript.c_str(), NULL); // exec the command
            close(out); // close output file
            _exit(0); //exit child process
        }
        break;
    }
    default:{
        // wait for child process
        int status = 0;
        waitpid(-1, &status, WNOHANG);
        printf("child status:%d\n",status);
        break;
    }
 }
forkOnce_getJson = true;

Как модули могут быть обнаружены другими приложениями, если не глобально, по крайней мере, за пределами virtualenv? Заранее спасибо !!

1 Ответ

0 голосов
/ 07 мая 2018

Как заметил @abarnert в комментариях выше, я использовал неправильный PATH. Правильная версия Python, которую я должен был выполнить из моей программы cpp, была на usr/local/bin/python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...