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 
    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']
      )

Ответы на вопрос(11)

мы сталкивались со случаями, когдафайл Безразлично»т работает как положено. Но следующий добралсяпока меня не подвела

import inspect
src_file_path = inspect.getfile(lambda:None)
 sdaau11 янв. 2019 г., 23:03
Это работает также, когда python встроен в другое приложение.

os.path.join(os.path.dirname(__file__)) в питоне интерактивная оболочка.

Python Shell Безразлично»обнаружить текущий путь к файлу в__file__ и это'связаны с вашимfilepath в котором вы добавили эту строку

Так что вы должны написать эту строкуos.path.join(os.path.dirname(__file__)) вfile.py, а потом бегиpython file.py, Это работает, потому что он занимает ваш путь к файлу.

 ztyh24 авг. 2018 г., 19:12
Но бежатьfile.py из сценария вы можете поместить его в тот же каталог, что и ваш сценарий, например. Поэтому вам нужно перейти в этот каталог перед запускомfile.py... Так что все же ищется что-то лучшее.
 s2t229 мая 2018 г., 17:35
точно мой опыт. но как заставить его работать в оболочке?
 foobarbecue15 апр. 2016 г., 03:29
Этот ответ правильный.

re exec 'используя файл через командную строку, вы можете использовать этот хак

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

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

Это прекрасно работает для меня:

wk_dir = os.path.dirname(os.path.realpath('__file__'))
 yarden.refaeli05 дек. 2017 г., 20:23
Почему это "ответ" все еще здесь?
 Gio03 сент. 2014 г., 21:05
Это действительно работает, но я могуне понимаю, почему. Почему"__file__" между кавычки рассматриваются иначе, чем__file__ без кавычек?
 Xiangyu25 апр. 2016 г., 19:16
Это невернуть каталог, в которомфайл находится, но просто возвращает текущий рабочий каталог (где вызывается python). -1
 Shubham Sharma15 сент. 2017 г., 08:26
это правильный ответ?
 SherylHohman07 июн. 2017 г., 05:53
В моем случае:script_dir = os.path.dirname("__file__") такой же какscript_dir = os.path.dirname(""), В обоих случаях,print(script_dir)  дает `` (пустая строка). Но `... (__ file--) это ошибка
 hobs04 авг. 2016 г., 07:33
Любое имя файла будет делать вместо"__file__", Например. ,realpath('nonexistentfile.whatever')
 JoshVarty20 сент. 2014 г., 23:23
Потому что это неt ссылка на отсутствующую глобальную переменную. Вместо этого он обрабатывает строкуфайл' как часть пути.
 Tommy01 мая 2016 г., 05:24
@Xiangyu правильно; этот ответ неверный. Если вы не всегда вызываете Python из того же каталога, что ифайл, Но это не работает, если вы вызываете python из другого места.
 Aalok18 июн. 2018 г., 20:01
@SherylHohman, потому что все, что вы передаетеdirname в кавычки будут обрабатываться относительно текущего рабочего каталога вашего процесса, и поэтому оба эти выражения оценивают по одному и тому же пути.
 Cas17 мар. 2017 г., 19:35
Этот ответ действительно должен быть удален какнеправильно и вводит в заблуждение. Тот факт, что за это проголосовали так высоко, вызывает беспокойство ...
 Mr_and_Mrs_D30 нояб. 2017 г., 23:41
@ShubhamSharma - нет это 'S не так

Что вы можете сделать, это использовать следующее

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__, Вы можете проверить это сами, конечно ..

Дополнительным бонусом этого решения является гибкость, когда вы запускаете сценарий частично в интерактивном режиме (например, для тестирования / разработки) и можете запустить его с помощью командной строкиI '

У меня была та же проблема с 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.42.7.13
 cd-rum19 мар. 2019 г., 00:11
Это заслуживает большего количества голосов.

измените свои коды следующим образом! меня устраивает. `

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

 davidlatwe06 сент. 2018 г., 06:58
Я думаю, что вы на самом деле используетеos.getcwd(), в соответствии сдоктори"__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()

Мы только что отправили Эндрю, что фрагмент кода в текущих документах неНадеюсь, это небудет исправлено.

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

Вам нужно выполнить файл напрямую, передав его в качестве аргументаpython команда:

$ python somefile.py

В вашем случае это действительно должно бытьpython setup.py install

os.getcwd() даст вам то же самое, что иos.path.dirname(__file__) до тех пор, пока вы не изменили рабочий каталог в другом месте вашего кода.os.getcwd() также работает в интерактивном режиме.

Такos.path.join(os.path.dirname(__file__)) становитсяos.path.join(os.getcwd())

 Shawn21 янв. 2019 г., 23:01
Это победитель

Вы используете интерактивный переводчик? Ты можешь использовать

sys.argv[0]

Вы должны прочитать:Как мне получить путь к текущему исполняемому файлу в Python?

 plustar20 нояб. 2018 г., 08:47
так должно бытьargv[1] вместоargv[0]
 hobs04 авг. 2016 г., 07:33
это даст путь к бинарному питону, который запустил оболочку, а НЕ текущему рабочему каталогу
 bruceparker20 февр. 2015 г., 17:43
fd = os.path.dirname (os.path.realpath (файл)) и распечатать его напечатано ... / .. / folder1 / но cwd = os.path.dirname (os.path.realpath (sys.argv [0])) >>> печатать cwd печатает ../../

Ваш ответ на вопрос