【问题标题】:NameError: __file__ is not definedNameError: __file__ 未定义
【发布时间】:2018-10-12 11:36:01
【问题描述】:

我正在尝试构建相对路径。在我的 .py 脚本中运行以下行时

this_path = os.path.abspath(os.path.dirname(__file__))

我收到一个名称错误。几天前我设置它时它曾经工作过,但现在它不再工作了。我没有在我的 shell 中执行这个,只是像往常一样运行我的脚本。

 os.path.dirname(sys.argv[0]) 

只返回一个空字符串。当我使用"__file__" 相反,它返回主目录而不是我的文件的路径。我以为__file__ 在我的脚本中加载模块后立即设置为文件路径。有谁知道我哪里出错了?

更多信息:我的 .py 脚本位于“C:/Users/corr/Documents/Uni/Thesis/Code/”的文件夹中我想构建一个相对路径,以便可以访问文件夹“C”中的数据文件:/Users/corr/Documents/Uni/Thesis/Data/"。当我设置脚本时,以下几行起作用:

this_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(this_path, "../Data")

现在,当我运行第一行时,我得到一个 NameError: __file__ not defined。当我使用"__file__" 运行同一行时,它返回“C:\Users\corr”。另外,我在 Spyder 环境中执行我的脚本,因为这是我通常工作的地方。

【问题讨论】:

  • 请提供更多信息:如目录结构、传递给运行脚本的命令等。
  • 运行脚本的命令行是什么?
  • 感谢您的宝贵时间。不幸的是,我不知道——我使用 Spyder 环境,只要我想运行我的脚本就按 F5(Spyder 使用 IPython)。你的问题给我带来了一个不同的解决方案——使用外部系统终端而不是 IPython:stackoverflow.com/questions/52117759/…
  • 设置失败时,sys.argv[0] 返回一个空字符串 ''。 (类型为 str)
  • (这里是 Spyder 维护者) 这看起来像一个错误,但在 Spyder 中没有,但可能在 IPython/ipykernel 中。如果您想解决这个问题,请在我们的issues tracker 中提出问题。

标签: python filepath spyder


【解决方案1】:

__file__set for modules,而不是脚本,应该使用 sys.argv[0]。 (在某些情况下,argv[0] 是用于通过PATH查找程序的基本名称。)Spyder 显然将其设置为空字符串(或者,在一个buggy version 中设置argv到一个空的列表),所以你可能不得不做一些愚蠢的事情,比如

def f(): pass
print(f.__code__.co_filename)

同时,使用"__file__"(字符串字面量)仅表示具有该名称的文件。 path.dirname 为它返回一个空字符串(因为它没有斜杠),许多 Python 函数(如 abspath)将其解释为当前工作目录(对于 Spyder 而言,这显然是你的主目录)。

【讨论】:

  • 感谢您的时间和精力。这并没有真正帮助(无疑是因为我没有完全理解自己的问题),但我仍然感谢您的帮助。当我在命令行中使用python file.py 运行它时,一切正常。一定是我在 Spyder 中设置工作流程的方式。
  • @corr:你说的没错,是 Spyder 导致了这个问题,但你尝试过co_filename 方法吗?
  • @DavisHerring,感谢您指出我们在两年前解决的错误。这真的是……
  • 顺便说一下,当文件通过F5Run > Run 运行而不是直接在我们的控制台中运行时,__file__sys.argv[0] 都按预期工作。戴维斯,您是否至少花时间验证了这一点?
  • @CarlosCordoba:我指出了这个错误,因为它的讨论是我能找到的关于argv 处理的唯一信息!我从未使用过 Spyder——我认为这并不妨碍我解释获取 Python 脚本和模块信息的标准方法。如果您知道如何操纵 Spyder 来更轻松地解决问题(似乎确实会发生,使用 F5),请务必写一个答案 - 如果更有意义,请编辑我的答案。跨度>
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2014-06-05
  • 1970-01-01
  • 2018-01-24
相关资源
最近更新 更多