2013-05-27 2 views
56

Когда я запускаю этот код в Python 2.7, я получаю эту ошибку:питон NameError: глобальное имя '__FILE__' не определен

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

Интересно ... – Alfe

+1

Попробуйте запустить этот код из оболочки: 'питона filename.py'. Related: http://bugs.python.org/issue8515 –

+1

Я решил его обработать __file__ как строку, то есть поместить «__file__» (вместе с кавычками!) Вместо __file__ – lsheng

ответ

7

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

sys.argv[0] 

Вы должны прочитать: How do I get the path of the current executed file in Python?

+0

fd = os.path.dirname (os. path.realpath (__ file__)) nd печать печатается .../../folder1/but cwd = os.path.dirname (os.path.realpath (sys.argv [0])) >>> print cwd prints ../../ –

+1

это даст путь к двоичному питону, который запустил оболочку, а не текущий рабочий каталог – hobs

0

У меня exacty такая же проблема и с использованием вероятно the same tutorial. Определение функции:

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

Я только что отправил Эндрю, что фрагмент кода в текущей документации не работают, мы надеемся, это будет исправлено.

2

Вы получите это, если вы работаете команды из питона оболочки:

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

63

Эта ошибка возникает, когда вы добавляете эту строку os.path.join(os.path.dirname(__file__)) в питона интерактивная оболочка.

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

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

+0

Этот ответ правильный. – foobarbecue

18

Я решил его обработкой файла в виде строки, то есть ставить "__file__" вместо __file__

Это прекрасно работает для меня (вместе с кавычками!):

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

Это действительно работает, но я не могу понять, почему. Почему '' __file __ "' между кавычками, обработанными иначе, чем '__file__' без кавычек? – Gio

+3

Потому что он не ссылается на отсутствующую глобальную переменную. Вместо этого он обрабатывает строку '__file__' как часть пути. – JoshVarty

+44

Этот ответ причудливый и показывает серьезное отсутствие понимания python. -1. – foobarbecue

1

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

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

5

У меня была такая же проблема с PyInstaller и py2exe поэтому я наткнулся на разрешение на 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) 

С выше кода вы можете добавить приложение на пути к вашей ОС, вы можете выполнить его в любом месте без проблем, что ваше приложение не в состоянии найти это файлы данных/конфигурации.

Испытано с питоном:

  • 3.3.4
  • 2.7.13
Смежные вопросы