복붙노트

[PYTHON] py2exe에서 실행 파일의 현재 디렉토리를 어떻게 얻을 수 있습니까?

PYTHON

py2exe에서 실행 파일의 현재 디렉토리를 어떻게 얻을 수 있습니까?

내 스크립트에서이 코드를 사용하여 크로스 플랫폼 방식으로 정확히 어디에서 실행되는지를 정확히 알려줍니다.

SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__))

아주 간단합니다. 그런 다음 스크립트의 다른 영역에서 SCRIPT_ROOT을 사용하여 모든 것이 적절히 맞는지 확인합니다. 생성 된 실행 파일이 __file__을 설정하지 않아 py2exe를 통해 실행할 때 내 스크립트가 중단되어 내 스크립트가 중단됩니다. 누구든지이 문제를 해결하거나 해결하는 방법을 알고 있습니까?

해결법

  1. ==============================

    1.다음은 py2exe 설명서입니다. 여기에 관련 항목이 있습니다.

    다음은 py2exe 설명서입니다. 여기에 관련 항목이 있습니다.

    이러한 문서에서 "exe-file"과 "executable"이 같은지 여부와 sys.executable과 sys.argv [0]가 같은지 여부는 분명하지 않습니다. 필자가 마지막으로 script.py와 py2exe_executable.exe 둘 다 작업 한 코드를 살펴보면 다음과 같은 것을 발견 할 수 있습니다.

    if hasattr(sys, 'frozen'):
        basis = sys.executable
    else:
        basis = sys.argv[0]
    required_folder = os.path.split(basis)[0]
    

    내가 말했듯이 그것이 효과가 있었지만 sys.argv [0]을 사용하는 대신에 왜 이것이 필요하다고 생각했는지 기억하지 못합니다.

    기본 작업만으로도 해당 작업에 적합했습니다 (해당 디렉토리의 파일 읽기). 보다 영구적 인 레코드를 얻으려면 os.path.realpath (basis)와 같은 것을 분리하십시오.

    업데이트 실제로 테스트를 수행했습니다. 어림짐작과 안락 의자 pontification :-)

    요약 : sys.frozen을 무시하고, sys.executable을 무시하고, sys.argv [0]을 무조건 처리하십시오.

    증거:

    === foo.py ===

    # coding: ascii
    import sys, os.path
    print 'sys has frozen:', hasattr(sys, 'frozen')
    print 'using sys.executable:', repr(os.path.dirname(os.path.realpath(sys.executable)))
    print 'using sys.argv[0]:',    repr(os.path.dirname(os.path.realpath(sys.argv[0]   )))
    

    === setup.py ===

    from distutils.core import setup
    import py2exe
    setup(console=['foo.py'])
    

    === 결과 ===

    C:\junk\so\py2exe>\python26\python foo.py
    sys has frozen: False
    using sys.executable: 'C:\\python26'
    using sys.argv[0]: 'C:\\junk\\so\\py2exe' # where foo.py lives
    
    C:\junk\so\py2exe>dist\foo
    sys has frozen: True
    using sys.executable: 'C:\\junk\\so\\py2exe\\dist'
    using sys.argv[0]: 'C:\\junk\\so\\py2exe\\dist' # where foo.exe lives
    
  2. ==============================

    2.Py2exe는 __file__을 정의하지 않습니다 : http://www.py2exe.org/index.cgi/Py2exeEnvironment

    Py2exe는 __file__을 정의하지 않습니다 : http://www.py2exe.org/index.cgi/Py2exeEnvironment

    OP가 py2exe 친화적 인 버전 요청 :

    SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__))
    

    가장 좋은 대답은 python이 exe에서 고정되어 있는지 확인하는 것입니다. py2exe에는 이에 대한 문서가 있습니다. http://www.py2exe.org/index.cgi/HowToDetermineIfRunningFromExe

    import imp, os, 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():
           return os.path.dirname(sys.executable)
       return os.path.dirname(os.path.realpath(__file__))
    
    SCRIPT_ROOT = get_main_dir()
    

    파이썬은 EAFP이기 때문에 여기 EAFP 버전이 있습니다 ...

    try:
       if sys.frozen or sys.importers:
          SCRIPT_ROOT = os.path.dirname(sys.executable)
    except AttributeError:
       SCRIPT_ROOT = os.path.dirname(os.path.realpath(__file__))
    

    건배!

  3. ==============================

    3.이 시도:

    이 시도:

    import os
    import sys
    os.path.realpath(os.path.dirname(sys.argv[0]))
    
  4. from https://stackoverflow.com/questions/2292703/how-can-i-get-the-executables-current-directory-in-py2exe by cc-by-sa and MIT license