python NameError:未定义全局名称“__file__”

python NameError: global name '__file__' is not defined

当我在python 2.7中运行此代码时,我得到以下错误:

1
2
3
4
5
6
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

代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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']
      )

当您在python交互shell中附加此行os.path.join(os.path.dirname(__file__))时,就会出现此错误。

Python Shell没有检测到__file__中的当前文件路径,它与添加此行的filepath有关。

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


我和PyInstaller和Py2Exe有同样的问题,所以我在cx Freeze的常见问题解答中找到了解决方案。

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

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

来源:http://cx-freeze.readthedocs.org/en/latest/faq.html

您的旧行(初始问题):

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

用以下代码段替换您的代码行。

1
2
3
4
5
6
7
8
9
10
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)

使用上述代码,您可以将应用程序添加到操作系统的路径,您可以在任何地方执行它,而不会出现应用程序无法找到其数据/配置文件的问题。

用python测试:

  • 3.3.4
  • 2.7.13


我把文件当作一个字符串来解决这个问题,即把"__file__"和引号放在一起!而不是__file__

这对我来说很好:

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


你在使用交互式翻译程序吗?你可以使用

1
sys.argv[0]

您应该阅读:如何获取当前在python中执行的文件的路径?


如果您所要查找的只是获取当前工作目录,那么只要您没有在代码的其他地方更改工作目录,os.getcwd()将提供与os.path.dirname(__file__)相同的内容。os.getcwd()也在交互模式下工作。

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


我遇到过文件不能按预期工作的情况。但到目前为止,以下几点并没有让我失望:

1
2
import inspect
src_file_path = inspect.getfile(lambda:None)


你能做的就是使用以下

1
2
3
4
5
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__。当然,你可以自己测试一下。

此解决方案的额外好处是,当您以部分交互方式运行脚本(例如测试/开发脚本)时,它具有灵活性,并且可以通过命令行运行脚本。


如果您正在运行来自python shell的命令,您将得到:

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

您需要直接执行该文件,将其作为参数传递给python命令:

1
$ python somefile.py

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


如果通过命令行执行文件,则可以使用此黑客

1
2
3
4
5
6
7
8
9
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

这对我来说是很有用的,在一个不可恢复的引擎里,我打电话给py.exec myfile.py


更改代码如下!它对我有用。`

os.path.dirname(os.path.abspath("EDOCX1〔7]))


我正面临着同样的问题,可能也在使用同样的教程。功能定义:

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

是马车,因为os.path.dirname(__file__)不会归还你需要的东西。尝试用os.path.dirname(os.path.abspath(__file__))替换os.path.dirname(__file__)

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

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