python NameError : 전역 이름 '__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
이 있습니다.
따라서이 줄 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.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
파일을 문자열로 처리하여 해결했습니다. 즉, "__file__"
대신 (따옴표와 함께!)__file__
이것은 나를 위해 잘 작동합니다.
wk_dir = os.path.dirname(os.path.realpath('__file__'))
인터랙티브 인터프리터를 사용하고 있습니까? 당신이 사용할 수있는
sys.argv[0]
읽어야합니다 : 파이썬에서 현재 실행 된 파일의 경로를 어떻게 얻습니까?
당신이 찾고있는 모든 것이 현재 작업 디렉토리를 얻는 것이라면 코드의 다른 곳에서 작업 디렉토리를 변경하지 않는 os.getcwd()
한 동일한 것을 제공합니다 os.path.dirname(__file__)
. os.getcwd()
대화 형 모드에서도 작동합니다.
그래서 os.path.join(os.path.dirname(__file__))
이된다os.path.join(os.getcwd())
__file__
예상대로 작동하지 않는 경우가 발생했습니다 . 그러나 다음은 지금까지 나를 실패하지 않았습니다.
import inspect
src_file_path = inspect.getfile(lambda: None)
다음과 같이 코드를 변경하십시오! 그것은 나를 위해 작동합니다. `
os.path.dirname(os.path.abspath("__file__"))
파이썬 셸에서 명령을 실행하면 다음과 같이 표시됩니다.
>>> __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 os
if '__file__' in vars():
wk_dir = os.path.dirname(os.path.realpath('__file__'))
else:
print('We are running the script interactively')
여기서 문자열 사용 '__file__'
은 실제로 실제 변수를 참조 한다는 점에 유의하십시오 __file__
. 물론 직접 테스트 할 수 있습니다 ..
이 솔루션의 추가 보너스는 스크립트를 부분적으로 대화 형으로 실행할 때 (예 : 테스트 / 개발) 명령 줄을 통해 실행할 수있는 유연성입니다.
나는 똑같은 문제가 있고 아마도 동일한 튜토리얼을 사용 하고 있습니다 . 기능 정의 :
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에게 현재 문서의 코드 조각이 작동하지 않는다고 게시했습니다.
명령 줄을 통해 파일을 실행하는 경우이 해킹을 사용할 수 있습니다.
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
참고 URL : https://stackoverflow.com/questions/16771894/python-nameerror-global-name-file-is-not-defined
'IT' 카테고리의 다른 글
PNG에 JPG와 같은 EXIF 데이터가 포함되어 있습니까? (0) | 2020.09.03 |
---|---|
Data.Void의 터무니없는 기능은 무엇에 유용합니까? (0) | 2020.09.03 |
EF 6 및 Code First 마이그레이션의 동일한 DB 및 애플리케이션에있는 여러 DB 다수 (0) | 2020.09.03 |
끔찍한 이벤트 리스너를 파괴하지 않고 innerHTML에 추가 할 수 있습니까? (0) | 2020.09.03 |
C ++ catch 블록-값 또는 참조로 발생합니까? (0) | 2020.09.03 |