python NameError : 전역 이름 '__file__'이 정의되지 않았습니다.


112

Python 2.7에서이 코드를 실행하면 다음 오류가 발생합니다.

Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\pyutilib.subprocess-3.5.4\setup.py", line 30, in <module>
    long_description = read('README.txt'),
  File "C:\Python26\Lib\site-packages\pyutilib.subprocess-3.5.4\setup.py", line 19, in read
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
NameError: global name '__file__' is not defined

코드는 다음과 같습니다.

import os
from setuptools import setup


def read(*rnames):
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()


setup(name="pyutilib.subprocess",
    version='3.5.4',
    maintainer='William E. Hart',
    maintainer_email='wehart@sandia.gov',
    url = 'https://software.sandia.gov/svn/public/pyutilib/pyutilib.subprocess',
    license = 'BSD',
    platforms = ["any"],
    description = 'PyUtilib utilites for managing subprocesses.',
    long_description = read('README.txt'),
    classifiers = [
        'Development Status :: 4 - Beta',
        'Intended Audience :: End Users/Desktop',
        'License :: OSI Approved :: BSD License',
        'Natural Language :: English',
        'Operating System :: Microsoft :: Windows',
        'Operating System :: Unix',
        'Programming Language :: Python',
        'Programming Language :: Unix Shell',
        'Topic :: Scientific/Engineering :: Mathematics',
        'Topic :: Software Development :: Libraries :: Python Modules'],
      packages=['pyutilib', 'pyutilib.subprocess', 'pyutilib.subprocess.tests'],
      keywords=['utility'],
      namespace_packages=['pyutilib'],
      install_requires=['pyutilib.common', 'pyutilib.services']
      )

답변:


134

이 오류는 os.path.join(os.path.dirname(__file__))파이썬 대화 형 쉘 에이 줄을 추가 할 때 발생합니다 .

Python Shell현재 파일 경로를 감지하지 않으며이 줄을 추가 한 사용자 __file__와 관련 filepath이 있습니다.

따라서이 줄 os.path.join(os.path.dirname(__file__))file.py. 그런 다음 실행 python file.py하면 파일 경로가 필요하기 때문에 작동합니다.


8
정확히 내 경험. 그러나 쉘 내에서 작동하도록하는 방법은 무엇입니까?
s2t2

1
그러나 file.py스크립트에서 실행하려면 예를 들어 스크립트와 동일한 디렉토리에 넣습니다. 따라서 실행하기 전에이 디렉토리로 이동해야합니다 file.py. 그래도 더 나은 방법을 찾고 있습니다.
ztyh

그래서 Emacs는 Cc Cp? 파이썬 쉘. 이 셸을 파일을 실행하는 터미널처럼 사용하는 방법이 있습니까? 셸을 실행하기위한 세 가지 옵션이 있습니다. CMD DEDICATED SHOW 그중 하나가이 작업을 수행할까요?
sinekonata

18

PyInstaller와 Py2exe에서 동일한 문제가 발생하여 cx-freeze의 FAQ에 대한 해결책을 찾았습니다.

콘솔에서 또는 응용 프로그램으로 스크립트를 사용할 때 아래의 기능은 "실제 파일 경로"가 아닌 "실행 경로"를 제공합니다.

print(os.getcwd())
print(sys.argv[0])
print(os.path.dirname(os.path.realpath('__file__')))

출처:
http://cx-freeze.readthedocs.org/en/latest/faq.html

이전 라인 (초기 질문) :

def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

코드 줄을 다음 스 니펫으로 대체하십시오.

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)

    return os.path.join(datadir, filename)

위의 코드를 사용하면 OS 경로에 애플리케이션을 추가 할 수 있으며, 앱이 데이터 / 구성 파일을 찾을 수 없다는 문제없이 어디서나 실행할 수 있습니다.

Python으로 테스트했습니다.

  • 3.3.4
  • 2.7.13

12

다음과 같이 코드를 변경하십시오! 그것은 나를 위해 작동합니다. `

os.path.dirname(os.path.abspath("__file__"))

7
docos.getcwd() 에 따르면 실제로 사용 하고 있다고 생각 하며 의미가 없습니다. "__file__"
davidlatwe

5
왜 찬성표가 있나요? 많은 사람들이 이것을 가져 갔고 처리되지 않은 예외를 제거했기 때문에 그것이 옳다고 생각 했습니까 ?? 이것은 올바른 해결책이 아닙니다 . 그것이하는 일은 말 그대로 " __file__" 라는 이름의 파일 이 있고 그것이 존재한다면
Todd

11

__file__예상대로 작동하지 않는 경우가 발생했습니다 . 그러나 다음은 지금까지 나를 실패하지 않았습니다.

import inspect
src_file_path = inspect.getfile(lambda: None)

이것은 C의 파이썬 아날로그에 가장 가까운 것입니다. __FILE__ 입니다.

Python의 동작은 __file__C의 동작과 많이 다릅니다.__FILE__ . C 버전은 소스 파일의 원래 경로를 제공합니다. 이는 오류를 기록하고 어떤 소스 파일에 버그가 있는지 아는 데 유용합니다.

Python __file__은 현재 실행중인 파일의 이름 만 제공하므로 로그 출력에서 ​​그다지 유용하지 않을 수 있습니다.


2
파이썬은 다른 응용 프로그램에 포함이 WORKSFORME
sdaau

나는 os.path.dirname(os.path.realpath(...))방법 보다 이것에 대해 더 좋은 행운을 얻었습니다 .
Mr. S

1
이것이 최고의 답변이어야합니다.
183.amir

9

인터랙티브 인터프리터를 사용하고 있습니까? 당신이 사용할 수있는

sys.argv[0]

읽어야합니다 : 파이썬에서 현재 실행 된 파일의 경로를 어떻게 얻습니까?


fd = os.path.dirname (os.path.realpath ( file )) nd 인쇄 ... / .. / folder1 / but cwd = os.path.dirname (os.path.realpath (sys.argv [0 ])) >>> print cwd prints ../../
bruceparker

7
이 NOT 현재 작업 디렉토리 쉘을 출시 이진 파이썬에 대한 경로를 제공합니다
호브

그것은해야한다 argv[1]대신argv[0]
plustar

9

파일을 문자열로 처리하여 해결했습니다. 즉, "__file__"대신 (따옴표와 함께!)__file__

이것은 나를 위해 잘 작동합니다.

wk_dir = os.path.dirname(os.path.realpath('__file__'))

8
이것은 실제로 작동하지만 이유를 이해할 수 없습니다. "__file__"따옴표 사이가 따옴표가 __file__없는 것과 다른 이유는 무엇 입니까?
Gio 2014 년

5
누락 된 전역 변수를 참조하지 않기 때문입니다. 대신 ' file ' 문자열을 경로의 일부로 취급합니다 .
JoshVarty 2014 년

42
이것은 파일 이 있는 디렉터리를 반환하지 않고 현재 작업 디렉터리 (python이 호출 된 위치) 만 반환합니다. -1
Xiangyu

8
모든 파일 이름이 "__file__". 예 realpath('nonexistentfile.whatever').
hobs

35
이 답변은 부정확하고 오해의 소지가 있으므로 제거해야합니다. 그것이 너무 높게 upvoted되었다는 사실은 오히려 걱정
Cas

6

당신이 찾고있는 모든 것이 현재 작업 디렉토리를 얻는 것이라면 코드의 다른 곳에서 작업 디렉토리를 변경하지 않는 os.getcwd()한 동일한 것을 제공합니다 os.path.dirname(__file__). os.getcwd()대화 형 모드에서도 작동합니다.

그래서 os.path.join(os.path.dirname(__file__)) 이된다 os.path.join(os.getcwd())


우승자입니다
Shawn

1
이 대답 은 정확하지 않습니다 . os.path.dirname(__file__)와 같은 것을보고하지 않습니다 os.getcwd(). 그것이주는 것은 파일의 dir 이름입니다. 일치 os.getcwd()하는 것으로 판명되면 우연 일뿐입니다.
Todd

4

파이썬 셸에서 명령을 실행하면 다음과 같이 표시됩니다.

>>> __file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__file__' is not defined

python명령에 인수로 전달하여 파일을 직접 실행해야합니다 .

$ python somefile.py

귀하의 경우에는 정말 python setup.py install


2

당신이 할 수있는 것은 다음을 사용하는 것입니다

import os
if '__file__' in vars():
    wk_dir = os.path.dirname(os.path.realpath('__file__'))
else:
    print('We are running the script interactively')

여기서 문자열을 사용하는 '__file__'것은 실제로 실제 변수를 참조합니다.__file__ . 물론 직접 테스트 할 수 있습니다 ..

이 솔루션의 추가 보너스는 스크립트를 부분적으로 대화 형으로 실행할 때 (예 : 테스트 / 개발) 명령 줄을 통해 실행할 수있는 유연성입니다.


메모와 관련하여 while '__file__'은 유효한 변수 이름이고 if조건이 참이면 파일 이름처럼 os.path.realpath('__file__')취급하는 가짜 경로를 반환합니다 '__file__'. 필요한 것이를 통한 상위 디렉토리 os.path.dirname()만 있으면 괜찮습니다.하지만 그것은 "해킹"입니다. @zwep
Todd

또한 __file__소스 파일 내에서 참조 하면 사용 된 파일의 경로를 얻게됩니다 os.getcwd().. 항상 귀하의 wk_dir-또는 직장 디렉토리 가 아닙니다 .
Todd

2

명령 줄을 통해 파일을 실행하는 경우이 해킹을 사용할 수 있습니다.

import traceback

def get_this_filename():
    try:
        raise NotImplementedError("No error")
    except Exception as e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        filename = traceback.extract_tb(exc_traceback)[-1].filename
    return filename

이것은 UnrealEnginePython 콘솔에서 저에게 효과적이었습니다. py.exec myfile.py


1

Jupyter 노트북에서 동일한 문제가 발생했습니다. 'os.path.split (os.path.realpath ( file ))'를 사용하는 동안 노트북에서 오류가 발생했습니다.

따라서 ' 파일 ' 을 사용했습니다 . 완벽하게 작동했습니다.


0

나는 똑같은 문제가 있고 아마도 동일한 튜토리얼을 사용 하고 있습니다 . 기능 정의 :

def read(*rnames):
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

os.path.dirname(__file__)필요한 것을 반환하지 않기 때문에 버그 가 있습니다. 교체 시도 os.path.dirname(__file__)와 함께 os.path.dirname(os.path.abspath(__file__)):

def read(*rnames):
    return open(os.path.join(os.path.dirname(os.path.abspath(__file__)), *rnames)).read()

방금 Andrew에게 현재 문서의 코드 조각이 작동하지 않는다고 게시했습니다. 다행히 수정 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.