2017-09-16 11 views
0

私はツールを開発しましたが、別のアプリケーションで使用したいと思います。さて、私は新しいアプリケーションで自分のツールをコピーするだけです。ファイルの構造は以下の通りです。isinstanceはネストされたアプリケーションで不適切な結果を返します

. 
├── inner 
│   ├── a 
│   │   ├── a.py 
│   │   └── __init__.py 
│   ├── b 
│   │   ├── b.py 
│   │   └── __init__.py 
│   ├── __init__.py 
│   └── inner.py 
└── outer.py 

a.py

class A(object): 

    def output(self): 
     print('A') 

b.py

from a.a import A 


class B(object): 

    def output(self, a): 
     print('B') 
     print(isinstance(a, A)) 

inner.py

from a.a import A 
from b.b import B 

a = A() 
b = B() 
a.output() 
b.output(a) 
B.outputが第二引数Aがインスタンスであるかどうかをチェックする

クラスAのランニングinner.pyランニング私は私の新しいアプリケーションフォルダの下に、ほぼ同じコードouter.pyを実行すると、ER innerが、しかし出力に

A 
B 
True 

を与え、出力が期待されていません。

A 
B 
False 

outer.py

import sys 

sys.path.append('inner') 


if __name__ == '__main__': 
    from inner.a.a import A 
    from inner.b.b import B 
    a = A() 
    b = B() 
    a.output() 
    b.output(a) 

私はouter.pyでprint(a)を追加すると、私は<inner.a.a.A object at 0x7f45e179f2d0>、ないa.a.A objectを取得します。

isinstanceが正しい結果を返すように内部アプリケーションを統合する方法が不思議ですか? innerの下にあるすべてのフォルダをsys.pathに追加しますか?もしそうなら、私は型検出を削除することを選択します。

答えて

0

これは随時尋ねられますが、適切な複製が見つかりませんでした。代わりにインストールしますインストールのPythonパッケージにそれを作る、と__main__として与えられたモジュールを実行するためにpython -m inner.innerを使用し、スクリプトパッケージを実行しているの

+0

私はこれまでに一度も知りませんでした!しかし、 'inner/b/b.py'の最初の行を' from inner.a.a import A'で 'inner.py'を実行するように変更する必要があります。それは最初の時点でツール名を指定する唯一の方法ですか? –

+0

@AnttiHaapalaこの音は面白いです。あなたは例を共有することはできますか?私はあなたの提案をよりよく理解しようとしています – Vinny

関連する問題