2012-03-09 14 views
1

私はパッケージがPythonで動作する方法をgrokしようとしています。私の目標は、Pythonがインストールされていることだけを要求することです。ユーザは、単にスクリプトリポジトリをチェックアウトして実行できるだけです。Python:スクリプトとそれをインポートする方法で提供されるカスタムパッケージ

関連ファイル(ls TestPackage.py Mypackage/の出力):TestPackage.py

TestPackage.py 

Mypackage/: 
__init__.py 
SomeClass.py 

内容:

from Mypackage import SomeClass 

print "Hello from TestPackage.py" 

the_instance = SomeClass() 

the_instance.hi() 

mypackageと/ の内容_ のinit _.py

class InsideInitPy(): 
    def hi(self): 
     print "Hi from InsideInitPy! (when importing package)" 

InsideInitPy().hi() 
mypackageとの

目次/ SomeClass.py

class SomeClass(): 
    def hi(self): 
     print "Hi from SomeClass in the package! (using explicit call)" 

テストスクリプトpython TestPackage.pyを実行する:エラーを生成

Hi from InsideInitPy! (when importing package) 
Hello from TestPackage.py 
Traceback (most recent call last): 
    File "TestPackage.py", line 5, in <module> 
    the_instance = SomeClass() 
TypeError: 'module' object is not callable 

ラインがthe_instance = SomeClass()あります。インポート時にHi from InsideInitPy! (when importing package)がコンソールに書き込まれるため、パッケージが見つかるようです。

  1. from Mypackage import SomeClass
  2. from Mypackage import *
  3. import Mypackage
:と TestPackage.pyに最初の行のこれらの変異体を使用して

どのように実施例を取得する(だけでなく、長所と短所の)ん

ユーザがTestPackage.pyと同じディレクトリにいるかどうかはインポートに影響しますか?

+1

Pythonのエラーメッセージが有益です:だから、あなたはモジュールMyPackage.SomeClassからクラスSomeClassをインポートすることができ、また

the_instance = SomeClass.SomeClass() 

を記述する必要があります。 ''モジュール 'オブジェクトが呼び出し可能ではない 'を取得した場合は、モジュールオブジェクトを呼び出しています。 – katrielalex

+0

さて、なぜ私はそれを呼び出すことができなかったのか分かりませんでした。 – Deleted

+0

私は上記の3つの質問に答え、回答を投稿するための知識を得るでしょう。提供された回答が私を助けたにもかかわらず、彼らは元の質問に答えなかった。私は検索の際にこの質問にヒットしたときに他の人を助けるかもしれないので、後で長い答えを自分で書く時間がかかるでしょう。 – Deleted

答えて

3

モジュールとクラスを混同しないでください。

あなたはファイルSomeClass.pyがあります。ファイルはモジュールに対応しています。したがって、import SomeClassモジュールを提供します。

SomeClass.pyの中には、クラス定義があります。そのクラスはSomeClass.SomeClassです。

from MyPackage.Someclass import SomeClass 
3

PythonはJavaではありません。

from Mypackage.SomeClass import SomeClass 
関連する問題