197

次のようなディレクトリ構造があります

meta_project
    project1
        __init__.py
        lib
            module.py
            __init__.py
    notebook_folder
        notebook.jpynb

notebook.jpynb相対インポートを使用して関数function()にアクセスしようとすると、次のように作業しますmodule.py

from ..project1.lib.module import function

次のエラーが表示されます。

SystemError                               Traceback (most recent call last)
<ipython-input-7-6393744d93ab> in <module>()
----> 1 from ..project1.lib.module import function

SystemError: Parent module '' not loaded, cannot perform relative import

相対インポートを使用してこれを機能させる方法はありますか?

ノートブック サーバーはmeta_projectディレクトリのレベルでインスタンス化されるため、これらのファイル内の情報にアクセスできる必要があります。

また、少なくとも元々意図project1されていたのはモジュールとは見なされていなかったため、__init__.pyファイルがなく、ファイルシステムディレクトリとして意図されていたことに注意してください。問題の解決策として、それをモジュールとして扱い、__init__.pyファイル (空のファイルでも) を含める必要がある場合は問題ありませんが、それだけでは問題を解決するには不十分です。

私はこのディレクトリをマシン間で共有し、相対インポートによりどこでも同じコードを使用できます。また、迅速なプロトタイピングにノートブックをよく使用するため、絶対パスを一緒にハッキングすることを含む提案は役に立たない可能性があります。


編集: これは、Python 3 の相対インポートとは異なります。これは、Python 3の相対インポートについて一般的に説明しており、特に、パッケージ ディレクトリ内からスクリプトを実行することについて説明しています。これは、異なる一般的側面と特定の側面の両方を持つ別のディレクトリのローカル モジュールで関数を呼び出そうとする jupyter ノートブック内での作業に関係しています。

4

10 に答える 10

240

このノートブックでは、隣接するモジュールの関数の使用法を DRY 方法で説明したいと考えていたのとほぼ同じ例がありました。

私の解決策は、次のようなスニペットをノートブックに追加して、追加のモジュール インポート パスを Python に伝えることでした。

import os
import sys
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
    sys.path.append(module_path)

これにより、モジュール階層から目的の関数をインポートできます。

from project1.lib.module import function
# use the function normally
function(...)

__init__.py空のファイルをまだ持っていない場合は、 project1/およびlib/フォルダーに追加する必要があることに注意してください。

于 2016-02-08T15:48:01.637 に答える
0

ここに私の2セントがあります:

システムをインポート

モジュールファイルが配置されているパスをマップします。私の場合、それはデスクトップでした

sys.path.append('/ユーザー/ジョン/デスクトップ')

マッピングモジュール全体をインポートしますが、.notation を使用して mapping.Shipping() のようなクラスをマッピングする必要があります

import mapping #mapping.py は私のモジュールファイルの名前です

shipit = mapping.Shipment() #Shipment は、マッピング モジュールで使用する必要があるクラスの名前です

または、マッピングモジュールから特定のクラスをインポートします

from mapping import マッピング

shipit = Shipment() #これで、.notation を使用する必要がなくなりました

于 2020-04-01T10:16:35.700 に答える