9

(Pythonの相対インポートに関連するStackOverflowには多くの質問があることに気づきました。これはすべて間違っているのではないかと思いますが、とにかくここに行きます..)

次のように編成されたpythonプロジェクト(mysubmod)があります。

/__init__.py
/lib
- /__init__py
- /foobar.py
/models
- /__init__.py
- /hello.py

重要:

  • /models/hello.py は lib.foobar をインポートします
  • /models/hello.py には、いくつかのテストを実行するメインブロックがあります。

次に、mysubmod を git サブモジュールとしてインポートした 2 番目のプロジェクト (myproj) を作成します。myproj は次のように編成されました -

/mysubmod
/scripts
- /__init__.py
- /__test.py

どこ:

  • scripts/test.py インポート mysubmod.models.hello

しかし、コマンド ラインから /scripts/test.py を実行すると、インタープリターは mysubmod/models/hello.py が lib.foobar を見つけられなくなったと不平を言うようになりました。

リロードします。

mysubmod/models/hello.py を変更して、..lib.foobar をインポートするようにしました

/scripts/test.py を問題なく実行できるようになりましたが、サブモッド スクリプトをコマンド ラインからファイルとして実行することはできなくなりました。python -m オプションを使用してモジュールとしてのみ実行できます。

また、インタープリターが「トッ​​プレベル パッケージを超えた相対インポートを試行しました」と不平を言うため、-m オプションを使用しても、サブモッド プロジェクト ファイルをスタンドアロン ベースで実行できなくなりました。つまり、実際には mysubmod を myproj ルート (ルート レベル ディレクトリとして mysubmod がある場所) からしか実行できません。

これはすべてかなり不十分なようです。私はできるようにしたい:

  • git submodule を使用して mysubmod を myproj にインポートし、「正常に機能する」ようにします
  • スタンドアロンベースで mysubmod を引き続き開発できます (つまり、モジュールではなくファイルとしてスクリプトを実行します)。

これを行う方法について誰か意見がありますか?git submodule と python に関するベストプラクティスについて何か意見はありますか?

ありがとう。

4

2 に答える 2

7

OK 答えは (何度も間違ったターンを経て)

  • 単一の最上位パッケージ mysubmod を追加します (例: 'helloworld')
  • mysubmod をサブモジュールとして myprod にインポートし、helloworld パッケージを myprod ルートにシンボリック リンクします (「ln -s mysubmod/helloworld helloworld」)。

このようにして、サブモッドをサブモジュールとして使用する場合でもスタンドアロン ベースで使用する場合でも、パッケージ構造は維持されます。

于 2013-03-28T07:31:52.017 に答える