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

时间:2013-05-27 11:11:59

标签: 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

代码是:

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']
      )

14 个答案:

答案 0 :(得分:112)

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

Python Shell未检测到__file__中的当前文件路径,并且与您添加此行的filepath相关

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

答案 1 :(得分:11)

我在使用PyInstaller和Py2exe时遇到了同样的问题,所以我在cx-freeze的FAQ中遇到了这个问题。

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

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)

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

使用python进行测试:

  • 3.3.4
  • 2.7.13

答案 2 :(得分:10)

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

这对我来说很好用:

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

答案 3 :(得分:8)

您使用的是交互式翻译吗?你可以使用

sys.argv[0]

您应该阅读:How do I get the path of the current executed file in Python?

答案 4 :(得分:6)

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

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

答案 5 :(得分:4)

我遇到了文件无法正常工作的情况。但是到目前为止,以下内容并没有使我失望:

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

答案 6 :(得分:2)

如果从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

答案 7 :(得分:2)

您可以做的是使用以下内容

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__。您当然可以自己测试一下。.

该解决方案的额外好处是,您可以部分交互地运行脚本(例如,测试/开发脚本)并可以通过命令行运行它

答案 8 :(得分:0)

我遇到了同样的问题,可能使用the same tutorial。功能定义:

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

是错误的,因为os.path.dirname(__file__)将无法返回您需要的内容。尝试将os.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()

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

答案 9 :(得分:0)

如下更改密码!这个对我有用。 `

os.path.dirname(os.path.abspath(“ __file__”))

答案 10 :(得分:0)

如果您通过命令行执行文件,则可以使用此技巧

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

答案 11 :(得分:0)

我在Jupyter笔记本中遇到了同样的问题。当我使用'os.path.split(os.path.realpath( file ))'时,笔记本电脑抛出错误。

我因此使用了“ 文件”。效果很好。

答案 12 :(得分:0)

如果您使用的是 jupyter notebook,例如:

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]'

完成.....

答案 13 :(得分:0)

我认为您可以这样做以获取本地文件路径

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