web-dev-qa-db-ja.com

現在実行中のモジュールのパス/名前を取得する方法

私は検索しましたが、これは単純な答えのない単純な質問のようです。

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にあり、他のバージョンは使用できません。

32
Danosaure

これは私にとってはうまくいきます:

__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__属性を追加し、ローダーオブジェクトに設定する必要があります。これは主にイントロスペクションのためですが、インポーターに関連付けられたデータの取得など、インポーター固有の追加機能に使用できます。

したがって、すべてのケースで正常に機能するようです。

26
Shawabawa

あなたは実際に__name__特殊変数を探していると思います。 Pythonドキュメント から:

モジュール内では、モジュールの名前(文字列として)は、グローバル変数__name__の値として使用できます。

ファイルを直接実行する場合、この名前は__main__になります。ただし、モジュールを使用している場合(-mフラグまたはその他のインポートを使用している場合など)は、モジュールの完全な名前になります。

11
Chris Phillips

-mを指定して実行すると、sys.path[0]には、モジュールへの完全パスが含まれています。これを使用して名前を作成できます。

ソース: http://docs.python.org/using/cmdline.html#command-line

別のオプションは__package__モジュール内で使用可能な組み込み変数。

8
dappawit

唯一の方法は、os.getcwd()、os.path、fileなどを使用してパス操作を行うことです。

実際、それはoptparse/argparse(現在、使用文字列の "%prog"をos.path.basename(sys.argv [0]で置き換えます)に実装するのに適したパッチである可能性があります-あなたareoptparseを使用しますよね?-)、つまり%moduleのような別の特別な文字列。

1
Giacomo Lacava

現在のモジュールのパス/名前を取得するためのオプションがいくつかあります。

最初に、Pythonでの__ file __の使用に慣れてください ここをクリックして使用方法を確認してください

現在ロードされているmoduleの名前を保持します。

次のコードを確認/試してください。それは、Python2Python3の両方で機能します。

# 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

したがって、ここでは現在のモジュール名の名前とその絶対パスを取得しました。

0
hygull

「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%ではありません。

0
Roman Susi