2016-07-07 20 views
1

私はノートブックにあるかどうかによって、モジュールのインポート名を変更しようとしています。 私は条件付きインポートノートブックのpython

api.py

is_notebook = False 
if is_notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm 

のようなものを試してみましたが、ノートブックのセルに私がどうなる:

import api 
api.is_notebook = True 

をしかし、動作するようには思えません。 これをどうすれば実現できますか?

+0

エラーは何をあなたは得る? –

+0

エラーはありませんが、インポートは変更されません。 – Orelus

+0

1. "try-except block"を試しましたか? 2.インポート用にデバッグコードを作成しましたか? tryとexceptブロックにprintステートメントを追加してみてください。 –

答えて

0

私たちは、このような中間ファイルabc.pyを使用して同じことを達成することができると思う:製品コードで、その後abc.py

is_notebook = False 
if is_notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm 

内容このようにしてみてください:

from abc import trange 
from abc import tqdm 

あなたはtrangeとtqdmの適切なコードを取得します。この機能api.pyコールをインポートした後

0

api.py

def imports(is_notebook): 
    if is_notebook: 
     from tqdm import tnrange as trange 
     from tqdm import tqdm_notebook as tqdm 
    else: 
     from tqdm import trange 
     from tqdm import tqdm 

api.imports(True) 
0

これは道のPythonモジュールのインポート作品に頼るハックソリューションのビットであり、おそらく非常に簡単に壊れます。謝罪いたします。

コードでは、モジュールapiをインポートした後でのみノートブックをTrueに設定しているため、効果はありません。しかし、参照がないので、モジュールがロードされる前にノートブック変数にアクセスすることはできません。 解決策は、3番目のモジュールを作成することです。空のテキストファイルである "notebook.py"を呼び出してみましょう。

まず、「ノートブックのインポート」を呼び出して、ノートブックモジュールのグローバルインスタンスを作成します。次に、そのモジュールのノートブックプロパティをtrueまたはfalseに設定します。

次に、import api。 apiから、ノートブックモジュールもインポートします。 Pythonはスマートで、モジュールを再度ロードするのではなく、同じオブジェクトへの参照を与えるだけです。これで、このモジュールの「ノートブック」プロパティを使用して、ロードするサブモジュールを確認できます。

最終COADは次のようになります。

notebook.py:

#no actual code here 

main.py

import notebook 
notebook.notebook=True 
import api 

api.py

import notebook 
if notebook.notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm