codememo

pythonNameError: 글로벌 이름 '__file_'이(가) 정의되지 않았습니다.

tipmemo 2023. 7. 17. 21:08
반응형

pythonNameError: 글로벌 이름 '__file_'이(가) 정의되지 않았습니다.

이 코드를 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']
      )

는 이 할 때 합니다.os.path.join(os.path.dirname(__file__))파이썬 대화형 셸에서.

Python Shell에서 현파경검않습에서 현재 .__file__그리고 그것은 당신의 것과 관련이 있습니다.filepath이 이 행을 .

이 을 래서당은이대써합야니다를사그신▁this▁line▁write합다니▁so▁should써야▁you라고 써야 합니다.os.path.join(os.path.dirname(__file__))file.py그리고 나서 뛰어요.python file.py파일 경로를 사용하기 때문에 작동합니다.

저는 PyInstaller와 Py2exe에 동일한 문제가 있어서 cx-freeze에서 FAQ에 대한 해결책을 발견했습니다.

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

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

다음과 같습니다.
http://cx-freeze..org/en/latest/faq.htmlhttp ://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 경로에 응용프로그램을 추가할 수 있으며, 응용프로그램이 데이터/구성 파일을 찾을 수 없는 문제 없이 어디서나 응용프로그램을 실행할 수 있습니다.

파이썬으로 테스트됨:

  • 3.3.4
  • 2.7.13

제가 우연히 발견한 사건은__file__예상대로 작동하지 않습니다.하지만 지금까지 다음은 저를 실망시키지 않았습니다.

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

이것은 C와 유사한 파이썬에 가장 가까운 것입니다.__FILE__.

파이행의 __file__의 C 것많는다릅다니이와 많이 .__FILE__C 버전은 원본 파일의 원래 경로를 제공합니다.이 기능은 오류를 기록하고 버그가 있는 원본 파일을 파악하는 데 유용합니다.

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

코드를 다음과 같이 변경합니다!저한테는 효과가 있어요.`

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

파일 .py 파일: 사용os.path.abspath(__file__)스크립트에서 직접 또는 주피터 노트북에서 코드를 사용하는 경우:파일을 이중 따옴표 안에 넣습니다. os.path.abspath("__file__")

당신은 대화형 통역기를 사용하고 있습니까?사용할 수 있습니다.

sys.argv[0]

다음을 읽어야 합니다.파이썬에서 현재 실행된 파일의 경로를 가져오려면 어떻게 해야 합니까?

현재 작업 디렉토리를 가져오는 것만 원하는 경우os.getcwd()와 같은 것을 당신에게 줄 것입니다.os.path.dirname(__file__)코드의 다른 곳에서 작업 디렉터리를 변경하지 않은 경우. os.getcwd()대화형 모드에서도 작동합니다.

그렇게os.path.join(os.path.dirname(__file__))된다os.path.join(os.getcwd())

python 셸에서 명령을 실행하는 경우 다음과 같이 표시됩니다.

>>> __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

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

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

이것은 언리얼 엔진 파이썬 콘솔에서 저에게 효과가 있었고, 전화했습니다.py.exec myfile.py

다음과 같은 주피터 노트북을 사용하는 경우:

MODEL_NAME = os.path.basename(파일)[:-3]

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-f391bbbab00d> in <module>
----> 1 MODEL_NAME = os.path.basename(__file__)[:-3]

NameError: name '__file__' is not defined

당신은 이렇게 앞에 '!'를 놓아야 합니다.

!MODEL_NAME = os.path.basename(__file__)[:-3]

/bin/bash: -c: line 0: syntax error near unexpected token `('
/bin/bash: -c: line 0: `MODEL_NAME = os.path.basename(__file__)[:-3]'

완료...

저도 똑같은 문제를 겪고 있고 아마 같은 튜토리얼을 사용하고 있을 것입니다.함수 정의:

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()

저는 앤드류에게 현재 문서의 코드 스니펫이 작동하지 않는다고 게시했습니다. 바라건대, 그것이 수정되기를 바랍니다.

로컬 파일 경로를 가져오는 방법을 사용할 수 있습니다.

if not os.path.isdir(f_dir):
    os.mkdirs(f_dir)

try:
    approot = os.path.dirname(os.path.abspath(__file__))
except NameError:
    approot = os.path.dirname(os.path.abspath(sys.argv[1]))
    my_dir= os.path.join(approot, 'f_dir')

주피터 노트북에서 작업하는 경우 작업 중인 스크립트에 따라 작업 공간을 설정하는 것이 편리합니다.

import os
import sys
os.chdir(Path(os.path.realpath('__file__')).parents[0])
sys.path.append(Path(os.path.realpath('__file__')).parents[0])

언급URL : https://stackoverflow.com/questions/16771894/python-nameerror-global-name-file-is-not-defined

반응형