пітон 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']
      )
66

8 адказы

Гэтая памылка ўзнікае, калі вы дадаеце гэты радок os.path.join (os.path.dirname (__ __ файл)) у пітона інтэрактыўнай абалонкі.

Python Shell doesn't detect current file path in __file__ and it's related to your filepath in which you added this line

Такім чынам, вы павінны напісаць гэты радок os.path.join (os.path.dirname (__ __ файл)) у file.py . а затым запусціць пітон file.py Гэта працуе, таму што ён прымае ваш FilePath.

83
дададзена
менавіта мой досвед. але як прымусіць яго працаваць у абалонцы?
дададзена аўтар s2t2, крыніца
Гэты адказ з'яўляецца правільным.
дададзена аўтар foobarbecue, крыніца
Але каб запусціць file.py з сцэнара, вы павінны змясціць яго ў тым жа каталогу, што і сцэнар, напрыклад. Так што вам трэба, каб перайсці ў гэты каталог перад запускам file.py ... Так што ўсё-такі нешта лепш шукаецца.
дададзена аўтар ztyh, крыніца

I solved it by treating file as a string, i.e. put "__file__" (together with the quotes!) instead of __file__

Гэта выдатна працуе для мяне:

wk_dir = os.path.dirname(os.path.realpath('__file__'))
10
дададзена
Таму што гэта не спасылаецца на адсутны глабальную зменную. Замест гэтага ён апрацоўвае радок « файл » як частка шляху.
дададзена аўтар JoshVarty, крыніца
@ShubhamSharma - не, гэта няправільна
дададзена аўтар Mr_and_Mrs_D, крыніца
Гэта сапраўды працуе, але я не магу атрымаць маю галаву вакол, чаму. Чаму «__ __ Файл» у двукоссі лячэнне адрозніваецца ад __ __ файл без двукоссяў?
дададзена аўтар Gio, крыніца
Гэта не вяртае каталог, у якім <�б> файл знаходзіцца, але проста вяртае бягучы працоўны каталог (дзе называецца пітон). -1
дададзена аўтар Xiangyu, крыніца
гэта яны адказаць правільна?
дададзена аўтар Shubham Sharma, крыніца
У маім выпадку: script_dir = os.path.dirname ( "__ __ Файл") такі ж, як script_dir = os.path.dirname ( "") . У абодвух выпадках друк (script_dir) дае `` (пустая радок). Але `... (__ file--) з'яўляецца памылкай
дададзена аўтар SherylHohman, крыніца
@Xiangyu правільна; гэты адказ з'яўляецца памылковым. Калі вы заўсёды патэлефанаваць пітона з той жа дырэкторыі, як <�я> Файл . Але гэта не працуе, калі вы тэлефануеце пітон з іншага месца.
дададзена аўтар Tommy, крыніца
Любое імя файла будзе рабіць замест «__ __» Файл . напрыклад <�Код> Realpath ( 'nonexistentfile.whatever') .
дададзена аўтар hobs, крыніца
Адказ на гэтае пытанне на самай справе павінны быць выдаленыя, як гэта няправільна і ўводзіць у зман. Той факт, што гэта upvoted так высока даволі трывожны ...
дададзена аўтар Cas, крыніца
Чаму гэта «адказ» да гэтага часу тут?
дададзена аўтар yarden.refaeli, крыніца
@SherylHohman гэта таму, што вы перайсці да имя_директории у двукоссях будуць разглядацца адносна бягучага працоўнага каталога вашага працэсу, і таму абодва гэтыя выразы вылічаюцца на той жа шлях.
дададзена аўтар Aalok, крыніца

Вы карыстаецеся інтэрактыўны інтэрпрэтатар? Вы можаце выкарыстоўваць

sys.argv[0]

You should read: How do I get the path of the current executed file in Python?

8
дададзена
гэта дасць шлях да выкананага пітона, які запусціў снарад, а не бягучы працоўны каталог
дададзена аўтар hobs, крыніца
FD = os.path.dirname (os.path.realpath (<�б> файл )) ой друку надрукаванае .../../folder1/але вуха = os.path.dirname (os.path. Realpath (sys.argv [0])) >>> друк CWD друкуе ../../
дададзена аўтар Aj Gauravdeep, крыніца

У мяне быў тая ж праблема з PyInstaller і py2exe таму я натыкнуўся на дазволе на FAQ ад ой замаразкі.

Пры выкарыстанні сцэнарыя з кансолі або ў якасці дадатку, функцыі па дадзеным Дагаворы будзе пастаўляць вам «шлях выканання», а не «фактычны шлях да файла»:

print(os.getcwd())
print(sys.argv[0])
print(os.path.dirname(os.path.realpath('__file__')))

Source:
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
5
дададзена

Калі ўсё, што вы шукаеце, каб атрымаць бягучую працоўную дырэкторыю os.getcwd() дасць вам тое ж самае, што os.path.dirname (__ __ файл) да таго часу, вы не змянілі працоўны каталог у іншым месцы ў кодзе. <�Код> os.getcwd() таксама працуе ў інтэрактыўным рэжыме.

So os.path.join(os.path.dirname(__file__)) becomes os.path.join(os.getcwd())

3
дададзена

Вы атрымаеце гэта, калі вы працуеце каманды з пітона абалонкі:

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

Вы павінны выканаць файл непасрэдна, перадаючы яе ў якасці аргументу пітона каманды:

$ python somefile.py

In your case, it should really be python setup.py install

2
дададзена

змяніць коды наступным чынам! гэта працуе для мяне. `

os.path.dirname (os.path.abspath ( " __ __ файл "))

1
дададзена

У мяне exacty такая ж праблема і з дапамогай, верагодна, жа падручнік . Вызначэнне функцыі:

def read(*rnames):
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

глючыць, так як os.path.dirname (__ __ файл) не будзе вяртаць тое, што вам трэба. Паспрабуйце замяніць os.path.dirname (__ __ файл) з os.path.dirname (os.path.abspath (__ __ файл)) :

def read(*rnames):
    return open(os.path.join(os.path.dirname(os.path.abspath(__file__)), *rnames)).read()

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

0
дададзена