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

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

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

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

2191閲覧

Python C拡張モジュール .pyファイルと共存

ablerjb

総合スコア13

C

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2017/05/18 15:22

Pythonで、学校の授業のよく使う自作関数を高速化しようと思って、現在、C言語拡張モジュールを作成しています。
しかし、自作関数の中にはc言語で書いても、あんまり速度の早くなる見込みがなく、ただひたすら長くなるだけなので、C言語で書きたくないなというものもあります。

そのためCとPythonのハイブリッドなライブラリにしようと思って、私、初心者なりに考えている、作成したいモジュールのディレクトリ構成は

lib ├── __init__.py ├── c_src │   └── myfunction.c ├── py_src │   ├── __init__.py │   └── myfunction.py ├── setup.cfg └── setup.py

ような形で、

Python

1from distutils.core import setup, Extension 2 3setup( 4 name= 'myfunction', 5 version= '1.0', 6 author= '***', 7 author_email= '***', 8 description= 'This is a package involves my functions', 9 py_modules= ['py_src.myfunction'], 10 ext_modules= [ 11 Extension('myfunction',sources=['c_src/myfunction.c']) 12 ] 13)

とsetup.pyを作成した場合
使用する際に

Python

1from lib.myfunction import * 2from lib.py_src.myfunction import *

とimportする必要があり、一つにまとまらないのでしっくりきません
一つに綺麗にまとめる方法はありますでしょうか。それとも、そもそもC言語で全て書いたり、2つに分けるのが普通なのでしょうか

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

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

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

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

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

guest

回答3

0

psutilが大変参考になると思います。

https://github.com/giampaolo/psutil

目指している通りのハイブリッドパッケージ、大きすぎない規模、メジャーでアクティブにメンテナンスされている等々、良いお手本になると思います。

質問に対しては恥ずかしながら「出来るはずだがやったことないし即答できない」という回答しかできません。

投稿2017/05/18 15:45

YouheiSakurai

総合スコア6142

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

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

ablerjb

2017/05/18 15:56

ご回答、ありがとうございます。 書ける人のプログラムを見ると勉強になりますよね! チェコ人ってプログラムできる人多いイメージ 笑
YouheiSakurai

2017/05/18 16:19

おー、オーナーはチェコ人?でも写真はチェコ人顔ではない気がする。まぁロシア人と同じくプログラマーなイメージがありますね。
shimizukawa

2017/05/18 23:28

参考になるプロジェクトとしては https://github.com/simplejson/simplejson も良いと思います。Cコンパイル可能な環境ではspeedup.cを使い、そうでなければ.py実装を使います。このように.cと.py両方で同じ機能を実装しているライブラリーはけっこうあります。 Cまで書きたくない場合はCythonも良いですね。型宣言付きPython、といった感じの言語ですが、Pythonっぽい文法で書いて、手軽にCコンパイルの高速化の恩恵を受けられます。
ablerjb

2017/05/19 14:51

ご回答ありがとうございます。 C++/Cは好きなので、Python apiに手を出し始めたのですが、たしかにコストが大きいので、まだまだ勉強が必要です。 挫折したら、Cythonも試してみたいと思います。 simplejson参考にさせていただきます
guest

0

質問の意図を勘違いしていたら申し訳ないけど、単純にPythonのモジュールで拡張モジュールをimportするだけのような気がします。

c

1/* 2 * c_mod.c 3 * gcc -shared -o c_mod c_mod.c `python-config --cflags --ldflags` 4 */ 5#include <Python.h> 6 7PyObject * piyo() 8{ 9 return PyUnicode_FromString("I'm a C module."); 10} 11 12PyMODINIT_FUNC 13initc_mod() 14{ 15 static PyMethodDef method_defs[] = { 16 { "piyo", (PyCFunction)piyo, METH_NOARGS, NULL }, 17 { NULL } 18 }; 19 20 Py_InitModule("c_mod", method_defs); 21} 22 23

python

1# py_mod.py 2# coding: utf-8 3 4from c_mod import * 5 6def hoge(): 7 return u'I\'m a Python module.' 8
>>> from py_mod import * >>> hoge() u"I'm a Python module." >>> piyo() u"I'm a C module." >>>

質問者さんのディレクトリ構成だと、pythonモジュールから拡張モジュールを呼び出すのに苦労しそうなので、同じディレクトリに置くほうがいいかもしれません。
(相対importでできるかなぁ…)

投稿2017/05/19 14:20

編集2017/05/19 14:22
katsuko

総合スコア3469

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

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

ablerjb

2017/05/19 14:41

大変ありがとうございます。盲点でした。 できました。
guest

0

ベストアンサー

単純に下記のように一気にインポートが出来ないので面倒だという話でしょうか?

python

1from lib.myfunction import *

拝見すると、パッケージ配下のディレクトリ構造は作成者の都合でわけられていますね。
しかし、そんな都合は利用者からは関係ありませんよね。

パッケージ配下のディレクトリを利用者から隠蔽(というか、利用者が使いやすい形に変換する)する役割を持っているのが__init__.pyです。
たぶん、__init__.pyに何も書いていないのではないでしょうか。

__init__.pyはパッケージにするためだけに、仕方なく配置する空ファイルではありません。
__all__などのキーワードを使えばよいでしょう。

投稿2017/05/21 01:38

編集2017/05/21 01:44
pashango2

総合スコア930

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

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

ablerjb

2017/05/21 01:58

ご回答ありがとうございます。 そんな役割があったなんて知りませんでした。 きれいにパッケージを作れました、ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問