python NameError:未定义全局名称"__file__"

Kai*_*ang 95 python nameerror

当我在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
Run Code Online (Sandbox Code Playgroud)

代码是:

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']
      )
Run Code Online (Sandbox Code Playgroud)

Nil*_*esh 125

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

Python Shell不检测当前文件路径__file__,它与filepath您添加此行的路径相关

所以,你应该写这条线os.path.join(os.path.dirname(__file__))file.py.然后运行python file.py,它的工作原因是它需要你的文件路径.

  • 完全是我的经验.但如何让它在shell中工作? (5认同)
  • 但是,要从脚本运行“file.py”,您可以将其放在与脚本相同的目录中。所以你需要在运行 `file.py` 之前移动到这个目录......所以仍然在寻找更好的东西。 (2认同)

Kwu*_*ite 15

我遇到了与PyInstaller和Py2exe相同的问题,所以我在cx-freeze中遇到了常见问题解答.

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

print(os.getcwd())
print(sys.argv[0])
print(os.path.dirname(os.path.realpath('__file__')))
Run Code Online (Sandbox Code Playgroud)

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

你的旧行(初步问题):

def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
Run Code Online (Sandbox Code Playgroud)

用以下代码替换您的代码行.

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)
Run Code Online (Sandbox Code Playgroud)

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

用python测试:

  • 3.3.4
  • 2.7.13

  • `os.path.realpath('__file__')` 不起作用,因为它位于引号之间。其余的答案很好 (2认同)

小智 15

如果您在 .py 文件中使用代码:使用 os.path.abspath(__file__) 如果您直接在脚本上或在 Jupyter Notebooks 中使用代码:将文件放在双引号内。 os.path.abspath("__file__")


Elo*_*ims 10

你在使用互动翻译吗?您可以使用

sys.argv[0]
Run Code Online (Sandbox Code Playgroud)

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

  • 这将给出启动shell的二进制python的路径,而不是当前的工作目录 (6认同)

lsh*_*eng 10

我通过将文件视为字符串来解决它,即放入"__file__"(与引号一起!)而不是__file__

这对我来说很好:

wk_dir = os.path.dirname(os.path.realpath('__file__'))
Run Code Online (Sandbox Code Playgroud)

  • 这不会返回__file__所在的目录,而只返回当前工作目录(调用python的地方).-1 (37认同)
  • 这个答案确实应该删除,因为它不正确和误导.它受到如此高度关注的事实令人担忧...... (29认同)
  • 这确实有效,但我无法理解为什么.为什么引号之间的`"__ file __"不同于没有引号的`__file__`? (8认同)
  • 任何文件名都将代替`"__file __"`.例如`realpath('nonexistentfile.whatever')`. (8认同)
  • 因为它没有引用丢失的全局变量.相反,它将字符串'__file__'视为路径的一部分. (5认同)
  • @Xianggyu是对的; 这个答案是对的.除非你总是从与*file*相同的目录中调用python.但是如果你从另一个位置调用python,这不起作用. (3认同)

小智 7

如果您要查找的只是获取当前工作目录os.getcwd(),os.path.dirname(__file__)那么只要您没有更改代码中其他位置的工作目录,就可以获得相同的功能. os.getcwd()也可以在交互模式下工作.

因此 os.path.join(os.path.dirname(__file__)) 变得 os.path.join(os.getcwd())

  • 这个答案**不正确**。`os.path.dirname(__file__)` 不会报告与 `os.getcwd()` 相同的内容。它给你的是文件的目录名。如果结果与 `os.getcwd()` 匹配,那只是一个巧合。 (4认同)

小智 7

如下更改您的代码!这个对我有用。`

os.path.dirname(os.path.abspath("__file__"))
Run Code Online (Sandbox Code Playgroud)

  • 为什么这有赞成票?很多人都接受了这个,并且因为它摆脱了未处理的异常,所以他们认为它是正确的?**这不是一个正确的解决方案**。它的作用是说您有一个字面名称为“__file__`”的文件,并且您在**如果存在的话,它可能位于哪个文件夹中!** (17认同)
  • 显然,这是可行的,因为 iPython 无法找到 `os.path.dirname( os.path.abspath( os.getcwd() + "\_file_"))` 并将其缩短为 `os.getcwd()`。 (3认同)
  • 根据[doc](https://docs.python.org/3/library/os.path.html#os.path.abspath),我认为您实际上是在使用os.getcwd()。 “ __file__”是没有意义的。 (2认同)

Bur*_*lid 5

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

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

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

$ python somefile.py
Run Code Online (Sandbox Code Playgroud)

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


Tod*_*odd 5

I've run into cases where __file__ doesn't work as expected. But the following hasn't failed me so far:

import inspect
src_file_path = inspect.getfile(lambda: None)
Run Code Online (Sandbox Code Playgroud)

  • 当 python 嵌入到另一个应用程序中时,这也适用 (2认同)