2009-05-19 23 views
3

私が開発したPythonシステムでは、通常、このモジュール構造を持っています。Pythonのインポート:.py拡張子を持たないモジュールのインポート?

mymodule/ 
mymodule/mymodule/feature.py 
mymodule/test/feature.py 

これにより、小さなテストフレームワークでtest/feature.pyを簡単にインポートして単体テストを実行できます。

mymodule/ 
mymodule/scripts/yetanotherfeature.py 
mymodule/test/yetanotherfeature.py 

yetanotherfeature.pyが/ usr/binににモジュールDebianパッケージによってインストールされます。しかし、我々は今、(Pythonで書かれている)、いくつかのシェルスクリプトを必要としています。しかし、私たちは明らかにそこに.pyの拡張子を望んでいません。だから、テストフレームワークのために、まだ私はこのシンボリックリンクthingieをしなければならないモジュールをインポートすることができるようにする:

mymodule/ 
mymodule/scripts/yetanotherfeature 
mymodule/scripts/yetanotherfeature.py @ -> mymodule/scripts/yetanotherfeature 
mymodule/test/yetanotherfeature.py 

はPythonでファイル名でモジュールをインポートすることが可能であり、またはあなたが考えることができますこのより洗練されたソリューションですか?

+2

はシンボリックリンクで何が悪いのでしょうか?これはこれを処理する最もエレガントな方法です。展開にも使用する必要があります。/usr/bin/featureは/usr/bin/feature.pyへのリンクです。実装を明確にすることでうまく動作します。 –

答えて

1

あなたが最も可能性の高い輸入hooksを使用して、いくつかのトリッカーを使用することができ、私はしかし、それをお勧めしません。一方、私はおそらく、それ以外の方法で、おそらくあなたの.pyスクリプトをどこかに持っていて、.pyファイルへのシンボリックリンクを.pyなしで作っています。したがって、あなたのライブラリはどこにでもあり、normall(それはpy拡張子を持っているので)をインポートして内部からテストを実行し、/ usr/bin/yetanotherfeatureがそれを指し示すので、pyなしで実行することができます。

編集:この(少なくともフック部分)ネヴァーマインド、輸入IMPソリューションは私には非常に良く見えます:)

+0

実際、これはおそらく最も理にかなっていると思います。現在のデザインは少し欠陥があると感じています:) – pojo

1

はIMPモジュールをチェックアウト:

http://docs.python.org/library/imp.html

これは、あなたがファイル名でモジュールをロードすることができます。しかし、あなたのシンボリックリンクはより洗練されたソリューションだと思います。

9

imp moduleがこのために使用されます。

[email protected]:/tmp/test$ cat mymodule 
print "woho!" 
[email protected]:/tmp/test$ cat test.py 
import imp 
imp.load_source("apanapansson", "mymodule") 
[email protected]:/tmp/test$ python test.py 
woho! 
[email protected]:/tmp/test$ 
+3

"mymodulec"というファイルが作成されます。 .pycであるはずですが、元のファイルが.pyで終わっていないので、最後にcをつけるだけです。それは変だと思う。これをしないようにすることはできますか? –

+0

"mymodulec"が作成されないようにするには、 'sys.dont_write_bytecode = True'を設定してください。 –

+0

imp.load_sourceは廃止されましたが、まだPython 2.7にあります。 Python 3.3については、[任意のPythonソースファイルをインポートする]を参照してください。 (Python 3.3+) - Stack Overflow](http://stackoverflow.com/questions/19009932/import-abitrary-python-source-file-python-3-3)を参照してください。名前の引数(ここでは "apanapansson")が何であるかを明確にするために、[python - モジュールの統合の結果として同じ名前のimp.load_sourceによるモジュールのロードを参照してください - Stack Overflow(http://stackoverflow.com/questions/) 15082857/load-modules-by-imp-load-source-with-same-nameの結果として合併されたモジュール)。 – nealmcb

0

別のオプションは、setuptoolsのを使用することです:

」...があります実際の "main"がどこかのモジュール内の関数である場合には、スクリプトのファイル名を簡単に作成する方法は、WindowsとPOSIXプラットフォームの両方でローカルな規則に一致しません。 ... setuptoolsは正しい拡張子で自動的にスクリプトを生成することでこれらの問題をすべて修正し、Windowsでは.exeファイルも作成します... "

https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation

関連する問題