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.3.4
  • 2.7.13

Ответ 3

Я решил это, рассматривая файл как строку, т.е. помещал "__file__" (вместе с кавычками!) вместо __file__

Это отлично работает для меня:

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

Ответ 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