【问题标题】:python NameError: name '__file__' is not defined [duplicate]python NameError:名称'__file__'未定义[重复]
【发布时间】:2014-06-10 12:06:47
【问题描述】:

我尝试用 py2exe 编译这个脚本:

import os 
file1 = os.path.dirname(os.path.realpath('__file__'))
file2 = os.path.realpath(__file__)

设置脚本:

from distutils.core import setup
import py2exe
import sys, os

if len(sys.argv) == 1:
    sys.argv.append("py2exe")

setup( options = {"py2exe": {"compressed": 1, "optimize": 2,"dll_excludes": "w9xpopen.exe", "ascii": 0, "bundle_files": 1}},
       zipfile = None,
       console = [
        {
            "script": "script.py",
            "dest_base" : "svchost"
        }
    ],)

编译脚本后,报此错误:

Traceback (most recent call last):
  File "script.py", line 2, in <module>
NameError: name '__file__' is not defined

问题出在哪里?

【问题讨论】:

  • 问题出在文件script.py的第2行
  • '__file__' 是一个字符串,所以第一行不会像你想的那样。
  • 不明白,如何解决 tge 问题?
  • 当我尝试这个时。它对我有用。 #!/usr/bin/python import os file1 = os.path.dirname(os.path.realpath('file')) file2 = os.path.realpath(file) 打印文件1 打印文件2

标签: python py2exe


【解决方案1】:

在 py2exe 下运行的脚本没有 __file__ 全局变量。检测到这一点并改用sys.argv[0]

import os.path

try:
    approot = os.path.dirname(os.path.abspath(__file__))
except NameError:  # We are the main py2exe script, not a module
    import sys
    approot = os.path.dirname(os.path.abspath(sys.argv[0]))

【讨论】:

  • 你会推荐使用 __ 文件 __ 还是 sys.argv[0] ?一个是当前工作目录,而另一个 __ 文件 __ 是文件的实际路径?
  • @Har; sys.argv[0] 是传递给 Python 的路径。对于脚本以外的模块,这将是错误的路径,因此使用__file__ 更加通用和灵活。
  • 传给python的路径默认是cwd吗?脚本以外的模块是指要导入的模块吗?
  • 任何 Python 文件都可以用作脚本或您导入的模块。 sys.argv[0] 文件名仅适用于脚本。该路径不一定是os.getcwd() 值;那可能是别的东西。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2018-08-01
  • 2020-06-17
相关资源
最近更新 更多