Saya mencoba menulis kode yang membungkus pustaka C dengan python. Saya berencana menggunakan CTypes untuk melakukannya dan saya menggunakan studio visual untuk mengkompilasi DLL saya. Saya mulai dengan fungsi sederhana dan saya menambahkan yang berikut di header dalam Visual Studio yang kemudian dibangun ke DLL

int our_function(int num_numbers, int* numbers) {
    int i;
    int sum = 0;
    for (i = 0; i < num_numbers; i++) {
        sum += numbers[i];
    }
    return sum;
}

Pembungkus python saya adalah sebagai berikut

import ctypes

_sum = ctypes.CDLL(r"C:\Users\spl\Desktop\Ctypes Testing\Ctypes tester 2.dll")
_sum.our_function.argtypes = (ctypes.c_int, ctypes.POINTER(ctypes.c_int))

def our_function(numbers):
    global _sum
    num_numbers = len(numbers)
    array_type = ctypes.c_int * num_numbers
    result = _sum.our_function(ctypes.c_int(num_numbers), array_type(*numbers))
    return int(result)

print(sum.our_function([1,2,-3,4,-5,6]))

Ketika saya menjalankan kode python saya mendapatkan kesalahan berikut:

Traceback (most recent call last):
  File "sum.py", line 3, in <module>
    _sum = ctypes.CDLL(r"C:\Users\spl\Desktop\Ctypes Testing\Ctypes tester 2.dll")
  File "C:\Users\spl\anaconda3\envs\Blank tester\lib\ctypes\__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application

Apa yang menyebabkan kesalahan ini dan bagaimana cara memperbaikinya? Saya menggunakan mesin 64 bit dengan windows 10 dan python build saya adalah 64 bit. Saya tidak tahu banyak tentang C, dan tujuan utamanya adalah membuatnya berfungsi sehingga saya bisa mengkodekan semuanya dengan python.

2
JavaNoob101 4 Juli 2020, 16:21

1 menjawab

Jawaban Terbaik

Ini adalah arsitektur CPU khas (32bit (.dll Anda) vs. 64bit (proses Python yang mencoba memuatnya)) tidak cocok. Periksa [SO]: Python Ctypes - memuat dll melempar OSError: [WinError 193] %1 bukan aplikasi Win32 yang valid (@jawaban CristiFati) untuk detail selengkapnya.

Buat versi 64bit dari .dll Anda.
Anda dapat menggunakan alat baris perintah dari URL yang disebutkan di atas, atau Anda dapat mengatur VStudio IDE untuk melakukannya, seperti yang dijelaskan dalam [MS.Docs ]: Cara: Mengonfigurasi proyek Visual Studio C++ ke Target 64-Bit, Platform x64:

  1. Buka proyek C++ yang ingin Anda konfigurasi.
  2. Buka halaman properti untuk proyek itu. Untuk informasi selengkapnya, lihat Menyetel Kompiler C++ dan membangun properti di Visual Studio.
  3. Pilih tombol Pengelola Konfigurasi untuk membuka kotak dialog Pengelola Konfigurasi.
  4. Dalam daftar tarik-turun Active Solution Platform, pilih opsi untuk membuka dialog New Solution Platform kotak.
  5. Dalam daftar tarik-turun Ketik atau pilih platform baru, pilih platform target 64-bit.
  6. Pilih tombol Oke. Platform yang Anda pilih pada langkah sebelumnya muncul di bawah Platform Solusi Aktif di kotak dialog Pengelola Konfigurasi.
  7. Pilih tombol Tutup di kotak dialog Pengelola Konfigurasi, lalu pilih tombol OK di Properti Halaman kotak dialog.
1
CristiFati 4 Juli 2020, 19:52