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='[email protected]',
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']
)
Ответы
Ответ 1
Эта ошибка возникает, когда вы добавляете эту строку os.path.join(os.path.dirname(__file__))
в интерактивную оболочку python.
Python Shell
не обнаруживает текущий путь к файлу в __file__
и связан с вашим filepath
, в который вы добавили эту строку
Итак, вы должны написать эту строку os.path.join(os.path.dirname(__file__))
в file.py
. а затем запустите python file.py
, он работает, потому что он принимает ваш путь к файлу.
Ответ 2
У меня была та же проблема с PyInstaller и Py2exe, поэтому я встретил разрешение в FAQ от cx-freeze.
При использовании вашего скрипта из консоли или в качестве приложения нижеуказанные функции предоставят вам "путь выполнения", а не "фактический путь к файлу":
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)
С помощью приведенного выше кода вы можете добавить свое приложение в путь к вашей ОС, вы можете выполнить его где угодно без проблем с тем, что ваше приложение не может найти его файлы данных/конфигурации.
Протестировано с питоном:
Ответ 3
Я решил это, рассматривая файл как строку, т.е. помещал "__file__"
(вместе с кавычками!) вместо __file__
Это отлично работает для меня:
wk_dir = os.path.dirname(os.path.realpath('__file__'))
Ответ 4
Используете ли вы интерактивный интерпретатор? Вы можете использовать
sys.argv[0]
Вы должны прочитать: Как мне получить путь к текущему исполняемому файлу в Python?
Ответ 5
Если все, что вы ищете, - это получить текущий рабочий каталог os.getcwd()
, даст вам то же самое, что и os.path.dirname(__file__)
, если вы не изменили рабочий каталог в другом месте вашего кода. os.getcwd()
также работает в интерактивном режиме.
Итак, os.path.join(os.path.dirname(__file__))
становится os.path.join(os.getcwd())
Ответ 6
Я сталкивался со случаями, когда __file__
не работает __file__
образом. Но следующее не подвело меня до сих пор:
import inspect
src_file_path = inspect.getfile(lambda: None)
Ответ 7
Вы получите это, если вы выполняете команды из оболочки 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
Ответ 8
Что вы можете сделать, это использовать следующее
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__
. Вы можете проверить это сами, конечно..
Дополнительным бонусом этого решения является гибкость, когда вы запускаете скрипт частично в интерактивном режиме (например, для тестирования/разработки) и можете запускать его через командную строку
Ответ 9
измените свои коды следующим образом! меня устраивает. '
os.path.dirname(os.path.abspath("__file__"))
Ответ 10
У меня такая же проблема, и, возможно, тот же самый учебник. Определение функции:
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, что фрагмент кода в текущих документах не работает, надеюсь, он будет исправлен.
Ответ 11
Если вы исполняете файл через командную строку, вы можете использовать этот хак
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