質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5811閲覧

pythonでc言語で作成したsoファイル呼び出し

kikkoro

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/17 02:30

編集2019/10/17 02:45

pythonでc言語で作成したsoファイルの呼び出しを行いたいのですが以下のようなエラーが出ます。解決方法を教えていただきたいです。お願いします。

OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。

参考にしたサイトのURLはこちらです。
https://qiita.com/motacapla/items/01de7d59cacb3f96caaf

cのコード 引数の行列の全要素にnを足すもの

#include <stdio.h> void add_matrix(double **matrix, int row, int col, int n) { int i, j; for(i=0; i<row; i++){ for(j=0; j<col; j++){ matrix[i][j] = matrix[i][j] + n; } } }

コンパイル方法

gcc -cpp -fPIC -shared libadd.c -lm -o libadd.so -O3

pythonコード

from ctypes import * import ctypes.util from numpy.ctypeslib import ndpointer import numpy as np from numpy.random import * #さっきつくったlibadd.soファイルを指定 lib = np.ctypeslib.load_library("libadd.so",".") #適当につくります row = 20 col = 5 n = 5 matrix = rand(row, col) #doubleのポインタのポインタ型を用意 _DOUBLE_PP = ndpointer(dtype=np.uintp, ndim=1, flags='C') #add_matrix()関数の引数の型を指定(ctypes)  lib.add_matrix.argtypes = [_DOUBLE_PP, c_int32, c_int32, c_int32] #add_matrix()関数が返す値の型を指定(今回は返り値なし) lib.add_matrix.restype = None #おまじない tp = np.uintp mpp = (matrix.__array_interface__['data'][0] + np.arange(matrix.shape[0])*matrix.strides[0]).astype(tp) #int型もctypeのc_int型へ変換して渡す n = ctypes.c_int(n) row = ctypes.c_int(row) col = ctypes.c_int(col) print("before:", matrix) lib.add_matrix(mpp, row, col, n) print("after:", matrix)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/10/17 02:38 編集

Windowsの共有ライブラリはsoファイルじゃなくてDLLです。 自分がやったことは全部書きましょう。(Cのソースは? それをどうやってコンパイルした? それでどんなファイルができた? Pythonのソースは?) あなたが参考にしたページだけあっても、あなたがやったことが書いてなければ回答者にとって役に立ちません。
kikkoro

2019/10/17 02:41

わかりました。 ありがとうございます 修正します。
y_waiwai

2019/10/17 02:59

上のコメントにあるように、WindowsであるならDLLファイルにしないといけないですね。 そこら編は元記事と使い方が代わるところもあろうかと思いますんで、 「python DLL」なんかでぐぐって、やり方を調べてみてください
kazto

2019/10/17 05:29

gcc は、どのようにインストールされていますか?MinGWか、WSLか、など。
kikkoro

2019/10/17 05:31

mingwです。windows環境ですべての作業を行っています。
kikkoro

2019/10/17 05:33

dllで行ってみても同じようなエラーが続いている状況です。
guest

回答2

0

ベストアンサー

同じことを試してみました。

エラーは再現せず、正常に出力できました。

~/teratail/217703 $ /mingw64/bin/python3 217703.py before: [[0.16907552 0.54475479 0.29343421 0.99251109 0.53793866] [0.49836795 0.1345557 0.81133548 0.47578002 0.11254435] [0.08782601 0.26368124 0.97762302 0.46920076 0.07625582] [0.75206545 0.38316879 0.39129107 0.62554517 0.85870704] [0.54757829 0.40239193 0.88050089 0.03073967 0.13993058] [0.34961185 0.53375434 0.70303961 0.61306086 0.46339245] [0.86764957 0.82763595 0.96527737 0.86747407 0.2374527 ] [0.98558594 0.44557724 0.41517505 0.55834841 0.20528071] [0.59301012 0.0211578 0.7952087 0.4138132 0.34220261] [0.83316162 0.16124767 0.10612151 0.45391563 0.65827497] [0.14193228 0.74187465 0.5811186 0.43472002 0.71064963] [0.33313274 0.56567498 0.26317035 0.88413386 0.05991336] [0.55390527 0.88797568 0.73225207 0.42832493 0.85777361] [0.25067528 0.79542509 0.29571593 0.45882687 0.52256078] [0.86218551 0.62716815 0.74375759 0.85264242 0.89361119] [0.87930005 0.83082409 0.95429463 0.96072707 0.17365143] [0.22662519 0.7995258 0.54913675 0.38172253 0.05378586] [0.61908445 0.55970329 0.4474468 0.87489184 0.10061107] [0.38872027 0.58895835 0.46465867 0.11407789 0.34336959] [0.43350952 0.01800028 0.63211445 0.29797311 0.53313962]] after: [[5.16907552 5.54475479 5.29343421 5.99251109 5.53793866] [5.49836795 5.1345557 5.81133548 5.47578002 5.11254435] [5.08782601 5.26368124 5.97762302 5.46920076 5.07625582] [5.75206545 5.38316879 5.39129107 5.62554517 5.85870704] [5.54757829 5.40239193 5.88050089 5.03073967 5.13993058] [5.34961185 5.53375434 5.70303961 5.61306086 5.46339245] [5.86764957 5.82763595 5.96527737 5.86747407 5.2374527 ] [5.98558594 5.44557724 5.41517505 5.55834841 5.20528071] [5.59301012 5.0211578 5.7952087 5.4138132 5.34220261] [5.83316162 5.16124767 5.10612151 5.45391563 5.65827497] [5.14193228 5.74187465 5.5811186 5.43472002 5.71064963] [5.33313274 5.56567498 5.26317035 5.88413386 5.05991336] [5.55390527 5.88797568 5.73225207 5.42832493 5.85777361] [5.25067528 5.79542509 5.29571593 5.45882687 5.52256078] [5.86218551 5.62716815 5.74375759 5.85264242 5.89361119] [5.87930005 5.83082409 5.95429463 5.96072707 5.17365143] [5.22662519 5.7995258 5.54913675 5.38172253 5.05378586] [5.61908445 5.55970329 5.4474468 5.87489184 5.10061107] [5.38872027 5.58895835 5.46465867 5.11407789 5.34336959] [5.43350952 5.01800028 5.63211445 5.29797311 5.53313962]]

拡張子は、so でよく、dllである必要はありませんでした。

私と、kikkoroさんとの違いは、Python、およびnumpyのインストール方法にあるかと推測します。

私は、以下のようにインストールしました。

Bash

1$ pacman -S mingw-w64-x86_64-python3 mingw-w64-x86_64-python3-numpy

kikkoroさんはどのようにインストールされましたか?

投稿2019/10/17 06:26

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kikkoro

2019/10/17 06:32

ご回答ありがとうございます。 anacondaを使用しました。 numpyも初めから用意されていたと思います。
kazto

2019/10/17 07:49

Anacondaをインストールして試してみました。 正常に動作しました。 ここで考えられるのは、gccが64bit向けバイナリである一方で、Anaconda(Python)が32bit向けバイナリである、というケースです。 `python -V` の結果はどう出力されますか?
kikkoro

2019/10/17 08:08

ご丁寧に対応してくださりありがとうございます。 Python 3.7.3 とversionのみ表示されます。
kazto

2019/10/17 08:12

失礼しました。-V だとそうですね(汗)。 引数ナシの`python`でインタラクティブモードで起動したときに、最初に出るバージョン文字列ではいかがでしょうか。 「Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32」のような感じです。
kikkoro

2019/10/17 14:32

同じように64bitとなっています。 pyファイルの実行環境と、cのコンパイルをどのように行ったか教えていただけないでしょうか。 私はpythonはspyderでcはコマンドプロンプト上でリンク先と同じ方法でコンパイルを行いました。
kazto

2019/10/18 01:10 編集

私は、コンパイルは「MSYS2 MinGW 64-bit」ターミナルで、 実行は「Anaconda Prompt」で実行しました。いちおうSpyderでも動かしてみましたが、動作しました。 ということは、下記2点が可能性として考えられます。 - コンパイルが上手く行っていない - Spyderが適切なディレクトリで実行していない
kazto

2019/10/18 01:17

こちらの環境で「OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。」というエラーを再現させることができました。 libadd.so を空のファイルにすることで、再現できました。 これで、コンパイルが上手く行っていない、という可能性が高くなってきました。 gccがちゃんとmingw64のgccを呼べているのか、が鍵となります。 コンパイル時、なにかメッセージは出てきませんでしたか?
kikkoro

2019/10/18 03:53

本当にご丁寧な対応ありがとうございます。 今後かなり活用したいことなので、大変助かります。 soファイルは27キロバイトでした。 コンパイル時はなにも出てきません しかしmingw64のgccを呼べていない可能性はありそうです。 少しこの後手が離せないため、連絡が遅くなってしまうかもしれません。 すみません。
kikkoro

2019/10/18 04:09

mingw64をインストールする際Architectureの項目を64bitの場合x86_64に変更する必要があるとのことでしたが、これを行っていませんでした。再度インストールしなおして試してみます。
kikkoro

2019/10/18 04:20

うまくいきました。 本当にありがとうございました。 ベストアンサーにさせていただきます。
guest

0

soファイルというのは実行形式ファイルではなくて、オブジェクトファイルという形式です
実行させるのなら、exeファイルにして、それを呼び出すようにしましょう


リンク先を見るとLinuxの実行形式にしてますね
いずれにしろ、Windowsで実行させるためにはexeファイルにしないといけませんねー

投稿2019/10/17 02:42

編集2019/10/17 02:48
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/10/17 02:47

soは共有ライブラリファイルなので、WindowsならDLLに対応します。 PythonのctypesライブラリもWindowsではDLLを呼び出すようになってます。 やりたいことを素直に考慮するなら、DLLを作ってPythonから呼び出す方法を回答するべきではないでしょうか。
kikkoro

2019/10/17 02:56

ご回答ありがとうございます。 exe化して実行をさせた場合でもcで作成した配列をpythonに持ってきて使用することなどは可能でしょうか。
y_waiwai

2019/10/17 03:00

上のコメントにあるように、WindowsであるならDLLファイルにしないといけないですね。 そこら編は元記事と使い方が代わるところもあろうかと思いますんで、 「python DLL」なんかでぐぐって、やり方を調べてみてください #こめんとするとこまちがたw
kikkoro

2019/10/17 03:01

ありがとうございます。 調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問