Program Tip

파이썬에서 __main__ 모듈의 파일 이름을 얻는 방법은 무엇입니까?

programtip 2020. 12. 7. 20:36
반응형

파이썬에서 __main__ 모듈의 파일 이름을 얻는 방법은 무엇입니까?


두 개의 모듈이 있다고 가정합니다.

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") 경로를 어떻게 얻 습니까?


import __main__
print __main__.__file__

아마도 이것은 트릭을 할 것입니다.

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

안전을 위해 __main__모듈에 __file__속성 있는지 확인해야 합니다. 동적으로 생성되었거나 대화 형 Python 콘솔에서 실행중인 경우에는 다음이 없습니다 __file__.

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

간단한 hasattr () 확인은 앱에서 가능성이있는 경우 시나리오 2를 방지하는 트릭을 수행합니다.


아래의 Python 코드는 py2exe실행 파일 과 원활하게 작동하는 것을 포함하여 추가 기능을 제공합니다 .

비슷한 코드를 사용하여 실행중인 스크립트와 관련된 경로를 찾습니다 __main__. 추가 혜택으로 Windows를 포함한 크로스 플랫폼에서 작동합니다.

import imp
import os
import sys

def main_is_frozen():
   return (hasattr(sys, "frozen") or # new py2exe
           hasattr(sys, "importers") # old py2exe
           or imp.is_frozen("__main__")) # tools/freeze

def get_main_dir():
   if main_is_frozen():
       # print 'Running from path', os.path.dirname(sys.executable)
       return os.path.dirname(sys.executable)
   return os.path.dirname(sys.argv[0])

# find path to where we are running
path_to_script=get_main_dir()

# OPTIONAL:
# add the sibling 'lib' dir to our module search path
lib_path = os.path.join(get_main_dir(), os.path.pardir, 'lib')
sys.path.insert(0, lib_path)

# OPTIONAL: 
# use info to find relative data files in 'data' subdir
datafile1 = os.path.join(get_main_dir(), 'data', 'file1')

위의 예제 코드가 실행중인 스크립트의 경로를 결정하는 방법에 대한 추가 정보를 제공 할 수 있기를 바랍니다.


또 다른 방법은 sys.argv[0].

import os
import sys

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

sys.argv[0]Python이 시작 -c되거나 Python 콘솔에서 확인 되면 빈 문자열이 됩니다.


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 컴파일 된 프로그램에서 작동합니다.

참고 URL : https://stackoverflow.com/questions/606561/how-to-get-filename-of-the-main-module-in-python

반응형