22

というpythonパッケージがあるとしましょうbestpackage

慣例では、これは を含む bestpacakgeディレクトリでもあり、インタープリターにインポート元であると想定させるように指示します。sys.path__init__.py

パッケージ名の変数を設定して、ディレクトリをインポートするディレクティブとは異なる名前にする方法はありますか? 名前空間がディレクトリ名を気にせず、代わりに他の構成を尊重するようにする方法はありますか?

something.otherthing.js私の非常にトレンディなクライアント側の開発者は、私たちの小さなサイド プロジェクトの 1 つにこれらのセクシーなプロジェクト名をとても気に入っています!

編集

明確にするために、私の質問の主な目的は、クライアント側の担当者が既存の規則 (some.app.js) を使用して、「プロジェクト」(私たち全員がパスに追加したもの) フォルダー内のディレクトリを引き続き呼び出せるようにすることでした。場合によっては、実際には python パッケージであり、パス上にあり、import内部でステートメントにソースされます。これは実際にはかなり恐ろしいことだとわかっているので、好奇心からもっと尋ねます。.したがって、ここでの大きな問題の一部は、ディレクトリ名 (およびそれによって想定されるパッケージ名) 内の が属性アクセスを意味するという事実を回避することです。これが回避できないことは本当に驚くことではありません。インポートの背後にある「魔法」の奥深くで可能かどうかに興味がありました。

.ここには素晴らしい回答がいくつかありますが、いずれも、属性アクセサーがディレクトリ名と衝突する、ある種の古典的なインポートを行うことに依存しています。

4

5 に答える 5

16

__init__.pyファイルのあるディレクトリはパッケージと呼ばれます。

いいえ、パッケージ名は常にディレクトリと同じです。これが、Python がパッケージを検出する方法であり、検索パスで見つかったディレクトリ名と照合し__init__.py、そのディレクトリにファイルがある場合は、一致を見つけて含まれているファイルをインポートし__init__.pyます。

from module import somethingまたはimport module as alias構文を使用して、より短くて使いやすい名前でローカル モジュールの名前空間に何かをいつでもインポートできます。

from something.otherthing.js import foo
from something.otherthing import js as bar
import something.otherthing.js as hamspam
于 2012-11-06T15:22:53.490 に答える
5

どこかに最初のインポートが1つ必要なソリューションが1つあります

>>> import sys
>>> sys.modules['blinot_existing_blubb'] = sys
>>> import blinot_existing_blubb
>>> blinot_existing_blubb
<module 'sys' (built-in)>

インポート メカニズムを変更しない限り、別の名前からインポートすることはできません。これは、Python を理解しやすくするためのものだと思います。

ただし、インポート メカニズムを変更したい場合は、これをお勧めします: Python インポートを最大限に活用する

于 2012-11-06T19:59:51.383 に答える
2

さて、最初に私はそれを言うでしょうPython is not Java/Javascript/C/C++/Cobol/YourFavoriteLanguageThatIsntPython。もちろん、現実の世界では、私たちの中には反対する上司に答えなければならない人もいます。したがって、間接的なものだけが必要な場合は、内部にあるものにあまり注意を払わない限り、煙と鏡を使用してください。モジュールをPythonの方法で記述し、同僚が望むドットの多いスタイルでAPIを提供します。元:

pythonic_module.py

def func_1():
    pass

def func_2():
    pass

def func_3():
    pass

def func_4():
    pass

indirection

/dotty_api_1/__init__.py

from pythonic_module import func_1 as foo, func_2 as bar

/dotty_api_2/__init__.py

from pythonic_module import func_3 as foo, func_4 as bar

今では彼らは心ゆくまで点在することができますが、あなたは内部でPythonのように物事を書くことができます。

于 2012-11-06T15:30:40.423 に答える
1

実はそうです!あなたはカノニカルimport Whateverまたはnewmodulename = __import__("Whatever")

pythonはモジュールを追跡し、次のようにしてそれを検査できます。

import sys
print sys.modules

この記事の詳細を参照してください

しかし、それはおそらくあなたの問題ではありませんか?推測してみましょう:別のパスにモジュールがありますが、sys-pathにないため、現在のプロジェクトはアクセスできませんか?

さて追加するだけです:

import sys
sys.path.append('path_to_the_other_package_or_module_directory')

importあなたの声明の前に、またはより恒久的な解決策についてはこのSO- postを参照してください。

于 2012-11-06T15:30:50.147 に答える