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

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

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

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

DLL

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

Python 3.x

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

解決済

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

namnium1125
namnium1125

総合スコア2041

Nim

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

DLL

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

Python 3.x

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

1回答

0リアクション

0クリップ

326閲覧

投稿2018/11/15 03:50

編集2018/11/15 03:55

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

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

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

fuga.nim

Nim

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

dllファイル化

bash

$ nim c --app:lib fuga.nim

fuga.py

Python

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

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

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

Nim

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

Python

from ctypes import cdll, c_buffer import ctypes st = c_buffer(b"", 32) dll = cdll.LoadLibrary('./fuga.dll') hoge = dll.hoge hoge(st) print(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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Nim

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

DLL

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

Python 3.x

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