PythonC Импорт не работает должным образом при вызове из сценария bash - PullRequest
0 голосов
/ 28 мая 2020

В настоящее время я создаю файл bash для многократного тестирования программы. Программа включает в себя PythonC, реализованные внутри c ++, когда я обычно вызываю файл ./lpopt -f File, он работает полностью нормально. Однако, если я включу эту же строку в сценарий bash, он не сможет импортировать модуль. Нужно ли мне указывать bash путь python отдельно? если да, то как?

вот часть моего кода, которая имеет дело с PythonC Import

#include <python2.7/Python.h>
#include <iostream>
#include <algorithm>
#include "predictor.hpp"

using namespace std;


predictor::predictor()
{
    Py_Initialize();

    pName = PyString_FromString("predictor");

    pModule = PyImport_Import(pName);

    if (pModule == nullptr) {
    PyErr_Print();
    std::cerr << "Fails to import the module predictor, check installation.\n";
    }

EDIT: Я забыл добавить сценарий bash. Строка, создающая ошибку: $ LPOPT_PRD -f $ d / encoding. asp> $ LPOPTPRDENCODING

#!/bin/bash

LPOPT='/home/danielb/Downloads/src/FLPOPT/bin/lpopt'
LPOPT_PRD='/home/danielb/Documents/LpoptVersions/bin/lpopt'

d=$1
mkdir -p "/home/danielb/Downloads/ModifiedEncodings/${d}"

LPOPTENCODING="/home/danielb/Downloads/ModifiedEncodings/${d}/${d}Lpopt.asp"
LPOPTPRDENCODING="/home/danielb/Downloads/ModifiedEncodings/${d}/${d}LpoptPrd.asp"

$LPOPT -f $d/encoding.asp > $LPOPTENCODING
$LPOPT_PRD -f $d/encoding.asp > $LPOPTPRDENCODING

for instance in $(find ${PWD}/${d} -name '*-*'); do

    LPEN=$(gringo $LPOPTENCODING $instance | wc -l)
    printf "%s,%s\n" $(echo $instance | cut -d '/' -f 7 | cut -d '-' -f 1) $LPEN >> "/home/danielb/Downloads/ModifiedEncodings/${d}/LpoptInstanceStats.txt" 


    LPPRDEN=$(gringo $LPOPTPRDENCODING $instance | wc -l)
    printf "%s,%s\n" $(echo $instance | cut -d '/' -f 7 | cut -d '-' -f 1) $LPPRDEN >> "/home/danielb/Downloads/ModifiedEncodings/${d}/LpoptPrdInstanceStats.txt" 


    EN=$(gringo $d/encoding.asp $instance | wc -l)
    echo $EN
    printf "%s,%s\n" $(echo $instance | cut -d '/' -f 7 | cut -d '-' -f 1) $EN >> "/home/danielb/Downloads/ModifiedEncodings/${d}/InstanceStats.txt" 


    echo "Completed instance"

done

Вот прикрепленная команда с сообщением об ошибке

sudo bash TestingScript.sh KnightTourWithHoles
[sudo] password for danielb: 
ImportError: No module named predictor
Fails to import the module predictor, check installation.
TestingScript.sh: line 13:  7121 Segmentation fault      (core dumped) $LPOPT_PRD -f $d/encoding.asp > $LPOPTPRDENCODING

Дополнительно только в если это помогает, то модуль, который я импортирую, находится в немного другом каталоге, чем пакеты сайта. Для справки

>>> print(predictor.__file__)
/home/danielb/miniconda2/lib/python2.7/site-packages/predictor-0.0.0-py2.7.egg/predictor.pyc
>>> import time
>>> print(time.__file__)
/home/danielb/miniconda2/lib/python2.7/lib-dynload/time.so
...