C ++ Qt: QProcess запускает путь к скрипту Python с указанием версии Python - PullRequest
0 голосов
/ 15 ноября 2018

Qt Creator 4.7.1 На основе Qt 5.11.2 (Clang 8.0 (Apple), 64 бит)

Я запускаю это в Qt.

QProcess p;
QStringList params;
params << "/Users/johan/Documents/testQt/hello.py";
p.start("python", params);
p.waitForFinished(-1);
qDebug() << "finished";
QString p_stdout = p.readAll();
qDebug() << p_stdout;
QString p_stderr = p.readAllStandardError();
if(!p_stderr.isEmpty())
   qDebug()<<"Python error:"<<p_stderr;

Iбыла та же самая ошибка как это: Qt, вызывающий python, используя QProcess

Python error: "ImportError: No module named site\r\n"  

И я добавил:

QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("PYTHONPATH", "/Users/johan/anaconda3/lib/python3.7");
env.insert("PYTHONHOME", "/Users/johan/anaconda3/bin/python");
p.setProcessEnvironment(env);

Я могу напрямую запустить скрипт python из терминала сpython hello.py./Users/johan/anaconda3/bin/python - это вывод which python.Я предполагаю, что у меня есть правильный путь для PYTHONHOME, но я все еще получаю ошибку.

Python error: "  File \"/Users/johan/anaconda3/lib/python3.7/site.py\", line 177\n    file=sys.stderr)\n        ^\nSyntaxError: invalid syntax\n"

Теперь это та же ошибка, что и эта: Использование нескольких версий Python

Но добавление предложенного #!python3 в сценарий не помогло.Я также пытался #!/Users/johan/anaconda3/bin/python.

После поисков в течение нескольких часов, теперь я действительно не знаю, как решить эту проблему.Как мне указать запуск с Python 3?Любая помощь приветствуется.

Я думаю, что это, вероятно, все еще проблема пути.Пожалуйста, объясните мне, что я не понимаю о PATH в целом.Я знаю, что PATH - это место, где оболочка ищет исполняемый файл.Но почему мы вставляем сюда PYTHONPATH и PYTHONHOME, а не просто добавляем их в PATH?Для чего нужны PYTHONPATH и PYTHONHOME?(Я прочитал документацию PYTHONHOME , но я не понимаю.)

EDIT (hello.py для тестирования импорта пакетов):

import time
import sys
import os
import tensorflow as tf
import numpy as np
import time
import inspect
import cv2

def main():
    time.sleep(1)
    print(os.path)
    print(sys.version_info[0])
    print("hello")

if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 16 ноября 2018

В PYTHONPATH должны быть пути к модулям (поэтому минимум site-packages), поэтому решение должно быть:

env.insert("PYTHONPATH", "/Users/johan/anaconda3/lib/python3.7/site-packages")

Вы также должны указать путь двоичного файла Python, которыйб:

p.start("/Users/johan/anaconda3/bin/python", params);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...