Подпроцесс Python дает неправильное значение (дает 8-битное значение вместо 64-битного)

Я тестирую опцию подпроцесса в Python. Я написал простой код на C и хочу запустить его в подпроцессе на Python. Вот как это выглядит:

Пример кода C.c (сначала я выполняю код, а затем в подпроцессе использую исполняемый файл):

#include <stdio.h>

int main(int argc, char *argv[]) {
    int number= 2110;

    while (1==1)
    {
        printf("%d",number);
        printf(" return number: ")
        return number;

    }
    return 0;
}

Код Python:

def subTest():
    while True:
        numberS = subprocess.call('./example')
        print (numberS)

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

2110 return number: 2110

Вывод, который я получаю:

2110 return number: 62

Я тестирую его на некоторых «числах» и правильных значениях, я получаю до 255, затем 256 -> 0 и т. Д. Почему это? Почему он дает 8-битные значения и как это сделать, чтобы вернуть правильные значения?


person BengBeng    schedule 20.09.2017    source источник


Ответы (1)


Это не проблема Python, а особенность Linux. Глядя на этот ответ:

В настоящее время большинство систем на основе Unix поддерживают только 8-битные возвращаемые значения. Windows поддерживает (как минимум) 32-битное возвращаемое значение.

Итак, если вы работаете в Unix, то даже если у вас есть int main(), возвращаемое значение ограничено от 0 до 255. Также из связанного вопроса:

int main(void){
return 256;
}
echo $? ;  # out 0

Вам придется найти другой способ вернуть значение - возможно, распечатать его? В этом ответе показано, как это сделать:

run = subprocess.Popen('./example', stdout = subprocess.PIPE,
                        stderr = subprocess.PIPE, env={'LANG':'C++'})
data, error = run.communicate()
numberS = int(data)
person Ken Y-N    schedule 20.09.2017
comment
Да, я на Raspbian, сумасшедшая вещь, возвращающая только 8-битные значения. В любом случае, если у меня, например, long long int main(), возникает та же проблема. Но я использую ваш код, и он выдает эту ошибку: ValueError: invalid literal for int() with base 10: b'' - person BengBeng; 20.09.2017
comment
Ваш код должен иметь printf("%d", number);, как вы указали в своем вопросе. Похоже, вы ничего не печатаете. - person Ken Y-N; 20.09.2017