Ошибка в методе argv [] SWIG C ++ / Python, что происходит? - PullRequest
0 голосов
/ 20 октября 2019

Я использую swig для соединения функции C ++ с моими библиотеками Python. Мне удалось все скомпилировать и создать файл .so. Но после выполнения импорта моей функции C ++ в python у меня есть некоторые ошибки в argv ... возможно, я ошибаюсь, передавая ему значения извне или, может быть, когда я скомпилировал и создал файл .i swigЯ понял что-то не так. Функция C ++ создает сокет TCP и отправляет шестнадцатеричный код на устройство, которое отвечает другим шестнадцатеричным кодом, из терминала с кодом C ++, который я пишу:

connect_PE_func 192.168.1.170 600000060

и работает отлично. и работает отлично. Я ожидал бы подобный синтаксис, как только я установлю свою функцию c ++ через swig в python, введите:

answer = connect_PE_func.connect_PE_func ("192.168.1.170", 600000060,2)

но я получаю эту ошибку:

test=connect_PE_func.connect_pe_func(["192.168.2.170"],["2600000026"])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-f58f79b27fe5> in <module>
----> 1 test=connect_PE_func.connect_pe_func(["192.168.2.170"],["2600000026"])

~/mqtt_atenapy/C_connect_PE_dev/test_cpython/connect_PE_func.py in connect_pe_func(argv, argc)
     64
     65 def connect_pe_func(argv, argc):
---> 66     return _connect_PE_func.connect_pe_func(argv, argc)
     67
     68

TypeError: in method 'connect_pe_func', argument 1 of type 'char *[]'

Я прикрепляю код к файлам .c .he .i, которые я использовал с swig для получения .so.

спасибо.

connect_PE.func.c:

#include <stdio.h>
#include <errno.h>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cstring>
#include <unistd.h>
#include <iostream>
#include <unistd.h>
#include <sstream>
#include "connect_PE_func.h"
using namespace std;

// to compile gcc connect_PE_func.cpp -lstdc++ -c
char* connect_pe_func(char *argv[],int argc)
{
    int sockfd, n;
    int connected = 0;
    struct sockaddr_in servaddr;
    std::string serveraddr = argv[1];

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr(serveraddr.c_str());
    servaddr.sin_port = htons(9761);

    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    std::string pref_hex;
    std::string hex("0x");
    std::string test = argv[2];
    size_t numbytes = test.size() / 2;

    uint8_t command[numbytes];

    for (size_t w = 0, x = 0; w < numbytes; ++w, x += 2)
    {
        pref_hex = hex + test.substr(x, 2);
        cout << pref_hex;
        command[w] = stoi(pref_hex, nullptr, 16);
        //cout << test.substr(x, 2);
        //cout << "\n";
        //cout << command[w];
        //cout << "\n";
    }

    //uint8_t command[] = {0x26, 0x00, 0x00, 0x00, 0x26};
    int bytes_to_send = sizeof(command);

    send(sockfd, command, bytes_to_send, 0);
    uint8_t output_command[numbytes];
    recv(sockfd, output_command, bytes_to_send, 0);

    char test_out[10];

    for (size_t w = 0, x = 0; w < numbytes; ++w, x += 2)
    {
        test_out[x] = (char)output_command[w];
        //cout << unsigned(test_out[x]);
    }
    return test_out;
}

connect_PE_func.h:

// file: connect_PE_func.h
char* connect_pe_func(char *argv[], int argc);

connect_PE_func.i:

/* file: connect_PE_func.i */
%module connect_PE_func
%{
/* Everything in this block will be copied in the wrapper file. We include the C header file necessary to compile the interface
*/
#include "connect_PE_func.h"
//  extern char *connect_pe_func(int argc, char *argv[]);
%}

/* list functions to be interfaced: */
char* connect_pe_func(char *argv[], int argc);

1 Ответ

0 голосов
/ 20 октября 2019

Вы не ввели запятую func(["192.168.2.170"] , ["2600000026"])

Полагаю, вам нужно пропустить func(["192.168.2.170", "2600000026"], 2)

...