私は検索しましたが、これは単純な答えのない単純な質問のようです。
a/b/c.py
で呼び出されるpython -m a.b.c
ファイルがあります。モジュールレベルで値a.b.c
を取得したいと思います。
USAGE = u'''\
Usage:
python -m %s -h
''' % (what_do_i_put_here,)
そのため、-h
オプションを受け取ったときは、USAGE
を表示します。実際の値をすべてのスクリプトに実際に書き留める必要はありません。
本当に必要な値を取得するためにinspect
を実行する必要がありますか?
ありがとう。
編集:言ったように、答えはあります(私は検索しました)が、単純な答えはありません。 inspect
を使用するか、traceback
を使用するか、__file__
と__package__
を操作して、部分文字列を実行して回答を取得します。しかし、モジュールにクラスがあるかのように単純なものではなく、myClass.__module__
を使用するだけで、必要な答えを得ることができます。 __name__
は常に__main__
であるため、(残念ながら)使用しても意味がありません。
また、これはpython 2.6にあり、他のバージョンは使用できません。
これは私にとってはうまくいきます:
__loader__.fullname
また、python -m b.c from a \を実行すると、予想どおり「b.c」が得られます。
__loader__属性が何であるか完全にはわからないので、これが良くない場合は私に知らせてください。
edit:PEP 302から取得: http://www.python.org/dev/peps/pep-0302/ =
リンクからの興味深いスニペット:
Load_module()メソッドには、実行する必要があるいくつかの責任がありますbefore任意のコードを実行します。
...
- モジュールに__loader__属性を追加し、ローダーオブジェクトに設定する必要があります。これは主にイントロスペクションのためですが、インポーターに関連付けられたデータの取得など、インポーター固有の追加機能に使用できます。
したがって、すべてのケースで正常に機能するようです。
あなたは実際に__name__
特殊変数を探していると思います。 Pythonドキュメント から:
モジュール内では、モジュールの名前(文字列として)は、グローバル変数
__name__
の値として使用できます。
ファイルを直接実行する場合、この名前は__main__
になります。ただし、モジュールを使用している場合(-mフラグまたはその他のインポートを使用している場合など)は、モジュールの完全な名前になります。
-mを指定して実行すると、sys.path[0]
には、モジュールへの完全パスが含まれています。これを使用して名前を作成できます。
ソース: http://docs.python.org/using/cmdline.html#command-line
別のオプションは__package__
モジュール内で使用可能な組み込み変数。
唯一の方法は、os.getcwd()、os.path、fileなどを使用してパス操作を行うことです。
実際、それはoptparse/argparse(現在、使用文字列の "%prog"をos.path.basename(sys.argv [0]で置き換えます)に実装するのに適したパッチである可能性があります-あなたareoptparseを使用しますよね?-)、つまり%moduleのような別の特別な文字列。
現在のモジュールのパス/名前を取得するためのオプションがいくつかあります。
最初に、Pythonでの__ file __の使用に慣れてください ここをクリックして使用方法を確認してください 。
現在ロードされているmoduleの名前を保持します。
次のコードを確認/試してください。それは、Python2とPython3の両方で機能します。
# module_names.py
import os
print (__file__)
print (os.path.abspath(__file__))
print (os.path.realpath(__file__))
MAC OS Xでの出力:
MacBook-Pro-2:practice admin$ python module_names.py
module_names.py
/Users/admin/projects/Python/python-the-snake/practice/module_names.py
/Users/admin/projects/Python/python-the-snake/practice/module_names.py
したがって、ここでは現在のモジュール名の名前とその絶対パスを取得しました。
「python -m a.b.c」のような制限がある理由がわかりません。もちろん、実際のモジュールはZipなどの中にある可能性がありますが、ラッパースクリプトを使用してアプローチ全体を単純化し、適切なコンテキストで実行が行われるようにしますpythonインスタンス。
ラッパーには次のものを含めることができます。
import sys
__import__(sys.argv[1])
次に、お気に入りのメソッドを使用して、使用するモジュール名を取得できます。
元の要件に戻します。私が正しく理解していれば、アイデアは、誰かがいくつかのサブサブディレクトリでpythonファイルを実行して、それが実際にsome.mega.packageのモジュールであることをメッセージから確認することです。
私は、c、bc、またはabcモジュールを実行する必要があるかどうかを特定のヒューリスティックを使用したファイルシステム分析なしで判断する信頼できる一般的な方法はないと思います(たとえば、外部ディレクトリですべての__init__.pyを見つけるまで、さらに__init__.py)、そして分析を行っても100%ではありません。