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='wehart@sandia.gov', 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'] ) 

在python交互式shell中追加这行os.path.join(os.path.dirname(__file__))出现这个错误。

Python Shell不会检测__file__当前文件path,它与您在其中添加此行的文件path有关

所以你应该在file.py写这行os.path.join(os.path.dirname(__file__)) 。 然后运行python file.py ,它可以工作,因为它需要你的文件path。

我解决了它通过将文件视为一个string,即把"__file__" (连同引号!),而不是__file__

这对我来说很好:

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

你在使用交互式口译员吗? 您可以使用

 sys.argv[0] 

你应该阅读: 我如何获得Python中当前执行文件的path?

如果你正在运行python shell的命令,你会得到这个:

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

您需要直接执行该文件,将其作为parameter passing给python命令:

 $ python somefile.py 

在你的情况下,它应该是真正的python setup.py install

我有PyInstaller和Py2exe相同的问题,所以我遇到了来自cx-freeze的FAQ的解决scheme。

从控制台或应用程序使用脚本时,下面的函数将为您提供“执行path”,而不是“实际文件path”:

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

用下面的代码replace你的代码行。

 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) 

通过上面的代码,您可以将应用程序添加到您的操作系统的path中,您可以在任何地方执行它,而不会出现应用程序无法find它的数据/configuration文件的问题。

用pythontesting过:

  • 3.3.4
  • 2.7.13

我有同样的问题,使用可能相同的教程 。 函数定义:

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

是越野车,因为os.path.dirname(__file__)不会返回你所需要的。 尝试用os.path.dirname(__file__)replaceos.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() 

我刚刚发布了安德鲁,当前文档中的代码段不起作用,希望能够纠正。

如果你正在寻找的是获得你当前的工作目录,只要你没有改变你的代码中其他地方的工作目录, os.getcwd()会给你和os.path.dirname(__file__)一样的东西。 os.getcwd()也可以在交互模式下工作。

所以os.path.join(os.path.dirname(__file__))变成了os.path.join(os.getcwd())