PythonNameError: 未定义全局名称“__ 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']
)
304228 次浏览

你在使用交互式解释器吗? 你可以使用

sys.argv[0]

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

我遇到了完全相同的问题,可能使用的是 同样的教程函数定义:

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

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

我刚刚发布了 Andrew 当前文档中的代码片段不能工作,希望它能被纠正。

如果您运行来自 python shell 的命令,那么您将得到以下结果:

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

在 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,它工作是因为它采用了你的文件路径。

如果你只是想得到你当前的工作目录,那么只要你没有改变代码中其他地方的工作目录,你就可以得到和 os.path.dirname(__file__)一样的结果。os.getcwd()也可以在交互模式下工作。

那么 os.path.join(os.path.dirname(__file__)) 变成了 os.path.join(os.getcwd())

我在使用 PyInstaller 和 Py2exe 时遇到了同样的问题,所以我偶然发现了来自 cx 冻结的 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

改变你的密码如下! 它为我工作。 `

os.path.dirname(os.path.abspath("__file__"))

我遇到过 __file__不能像预期的那样工作的情况,但是以下几点到目前为止还没有让我失望:

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

这是最接近 Python 类似于 C 语言的 __FILE__的东西。

Python 的 __file__的行为与 C 的 __FILE__有很大不同。C 版本将提供源文件的原始路径。这在记录错误和知道哪个源文件有错误时很有用。

Python 的 __file__只提供当前正在执行的文件的名称,这在日志输出中可能不太有用。

如果你通过命令行执行一个文件,你可以使用这个黑客技术

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

这对我在 UnrealEnginePython 控制台中工作,调用 py.exec myfile.py

如果你使用木星笔记本,例如:

MODEL _ NAME = os.path.basename (文件)[ :-3]

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-f391bbbab00d> in <module>
----> 1 MODEL_NAME = os.path.basename(__file__)[:-3]


NameError: name '__file__' is not defined

你应该像这样在前面放一个“ !”

!MODEL_NAME = os.path.basename(__file__)[:-3]


/bin/bash: -c: line 0: syntax error near unexpected token `('
/bin/bash: -c: line 0: `MODEL_NAME = os.path.basename(__file__)[:-3]'

好了。

我认为你可以这样做,得到你的本地文件路径

if not os.path.isdir(f_dir):
os.mkdirs(f_dir)


try:
approot = os.path.dirname(os.path.abspath(__file__))
except NameError:
approot = os.path.dirname(os.path.abspath(sys.argv[1]))
my_dir= os.path.join(approot, 'f_dir')

如果您正在使用. py 文件中的代码: 使用 os.path.abspath(__file__) 如果你直接在脚本上或者在木星笔记本上使用这些代码: 将 文件放在双引号中。 os.path.abspath("__file__")