73

2 つのモジュールがあるとします。

a.py:

import b
print __name__, __file__

b.py:

print __name__, __file__

「a.py」ファイルを実行します。これは以下を出力します:

b        C:\path\to\code\b.py
__main__ C:\path\to\code\a.py

質問__main__: 「b.py」ライブラリ内からモジュール (この場合は「a.py」)へのパスを取得するにはどうすればよいですか?

4

5 に答える 5

88
import __main__
print(__main__.__file__)
于 2009-03-03T16:04:22.800 に答える
40

おそらくこれでうまくいくでしょう:

import sys
from os import path
print(path.abspath(str(sys.modules['__main__'].__file__)))

__main__安全のため、モジュールに__file__属性があるかどうかを確認する必要があることに注意してください。__file__動的に作成された場合、またはインタラクティブなPythonコンソールで実行されている場合は、 :はありません。

python
>>> import sys
>>> print(str(sys.modules['__main__']))
<module '__main__' (built-in)>
>>> print(str(sys.modules['__main__'].__file__))
AttributeError: 'module' object has no attribute '__file__'

単純なhasattr()チェックは、シナリオ2がアプリで可能である場合に、シナリオ2を防ぐためのトリックを実行します。

于 2009-03-03T14:27:58.427 に答える
8

別の方法は、を使用することsys.argv[0]です。

import os
import sys

main_file = os.path.realpath(sys.argv[0]) if sys.argv[0] else None

sys.argv[0]-cPython を起動するか、Python コンソールからチェックすると、空の文字列になります。

于 2014-04-05T18:08:36.460 に答える
3
import sys, os

def getExecPath():
    try:
        sFile = os.path.abspath(sys.modules['__main__'].__file__)
    except:
        sFile = sys.executable
    return os.path.dirname(sFile)

この関数は、PythonおよびCythonでコンパイルされたプログラムで機能します。

于 2013-01-17T20:57:33.853 に答える