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

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

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

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Python 3.x

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

Q&A

解決済

1回答

639閲覧

Nimで文字列を扱うdynlib(.dll)を作成しPythonから使用したい

namnium1125

総合スコア2043

Nim

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Python 3.x

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

0グッド

0クリップ

投稿2018/11/15 03:50

編集2018/11/15 03:55

いつもお世話になっております。m(_ _)m

どうしてもPythonからNimで作成したツールを使用する必要があり、また少し大きめの文字列をNimで作成したツールからPythonに渡さなければならず、色々調べたのですが自分ではわからなかったので質問させてください。

後述しているように他の方法を検討してみたのですがうまくいかず、現在はdllでやり取りできないかと考えております。
そこで以下のようにしてみました。(モデルです。)

fuga.nim

Nim

1proc hoge(): cstring {.exportc, dynlib.} = 2 result = "hoge"

dllファイル化

bash

1$ nim c --app:lib fuga.nim

fuga.py

Python

1from ctypes import cdll 2import ctypes 3 4dll = cdll.LoadLibrary('./fuga.dll') 5hoge = dll.hoge 6print(hoge()) # => 自分の環境では1802407936になりました。

しかし、コメントアウトに示すように、整数値が表示されてしまいました。

おそらく文字配列のアドレスか何かかと思い、Nim側でptraddr関数を使用し、Python側でc_bufferを使用する、といったことを行ったのですがこれもうまくいきませんでした。

Nim

1proc hoge(st: var ptr cstring) {.exportc, dynlib.} = 2 var hoge = cast[cstring]("hoge") 3 st = hoge.addr

Python

1from ctypes import cdll, c_buffer 2import ctypes 3 4st = c_buffer(b"", 32) 5dll = cdll.LoadLibrary('./fuga.dll') 6hoge = dll.hoge 7hoge(st) 8print(st.value) # => b'X\xee\x1e\xb7Y' # 実行毎に変動しました

どうすればdllを介して文字列をやり取りできるのでしょうか?

ファイル等を介してやり取りするのではなく、dllを使用しなければならない理由は、実際のコードでは関数呼び出しを相当な回数行う必要があり、処理時間が膨大になってしまうと考えているからです。

始めはpexpectを使用して子プロセスとしてやり取りすることを考えていたのですが、Windowsだとwinpexpectを使用しなければならずさらに試してみてダメだったので断念しました。(subprocessが使えないのはインタラクティブなやりとりが必要だからです。)

ダイナミックリンクライブラリ自体、必要に迫られて先ほど触り始めたのでほとんど理解していません。。

この分野に詳しい方、もしくは何か解決策の糸口となる方法をご存知の方がおりましたら、何卒よろしくお願いいたします。m(_ _)m

環境

  • Python 3.6.4 :: Anaconda, Inc.
  • Nim Compiler Version 0.18.0 [Windows: amd64]
  • MINGW64_NT-10.0 **** 2.10.0(0.325/5/3) 2018-02-09 15:25 x86_64 Msys

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

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

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

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

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

guest

回答1

0

ベストアンサー

nimって知らないのですが、おそらく

c

1/* 2proc hoge(): cstring {.exportc, dynlib.} = 3 result = "hoge" 4*/ 5const char * hoge() 6{ 7 return "hoge"; 8}

というCの関数と同様だと思うので、そのつもりで回答します。

とりあえず、マニュアル。

上記によれば、関数の属性「restype」にctypesの型を指定すれば、その型にあったオブジェクトに変換してくれるそうです。

python

1from ctypes import cdll, c_char_p 2 3dll = cdll.LoadLibrary('./fuga.dll') 4hoge = dll.hoge 5hoge.restype = c_char_p 6print(hoge())

でどうですか。

投稿2018/11/15 11:42

編集2018/11/15 11:48
katsuko

総合スコア3462

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

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

namnium1125

2018/11/15 12:56

その方法でうまくいきました!ありがとうございます! 返り値の型をPython側で指定する必要があったのですね..ctypesについて理解が足りておりませんでした(^ ^; ベストアンサーとさせていただきます。改めてありがとうございました。m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問