python异常,报错NameError: name ‘__file__’ is not defined怎么解决?

目录

一、__file__的作用

二、如果出错了,要如何才能解决错误?

三、如何输出“项目路径”?

四、参考来源



一、__file__的作用

在使用run来执行程序中的代码的时候,该代码中会存储当前执行的程序文件所属路径。

# 在pycharm2021.3中run以下存储在test.py中的代码

import os
print(os.path.dirname(__file__)) # 输出绝对目录(不带文件名)
print(os.path.abspath(__file__)) # 输出绝对路径(带文件名)

# D:\BaiduNetdiskDownload\pythonProject\456\123\123.py
# D:\BaiduNetdiskDownload\pythonProject\456\123
# 可以看出两种函数的返回路径结果中一个是正斜号,一个是反斜号。

而如果在pycharm的console或者terminal中执行以上代码,就会出以下错误

Traceback (most recent call last):
  File "D:\Program Files\python\venv38\py-cv-learning\lib\site-packages\IPython\core\interactiveshell.py", line 3251, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-56-6530e1d1689e>", line 1, in <module>
    print(os.path.dirname(__file__))
NameError: name '__file__' is not defined

二、如果出错了,要如何才能解决错误?

只有唯一一种方法,也就是使用run来执行程序代码。

        如果使用run功能来运行程序代码,打印【__file__】可以得到当前执行的py文件所属路径。而直接执行打印命令也会出现该错误。

# 如果用run功能执行test.py程序
print(__file__)  
# D:\BaiduNetdiskDownload\pythonProject\456\123\123.py

# 如果直接在console交互窗口中执行这串代码
print(__file__) 
# NameError: name '__file__' is not defined

# 如果在file魔法方法上加单(双)引号,run和console都会只输出原字符串
print("__file__")
# __file__

        如果还想要加上调试功能,可以勾选 run with python console 选项。

注意:如果勾选run with python console选项,那么run某file的效果等同于右键执行下图的命令。(后文有提到,这样创建的console的工作目录是pyfile文件所属目录)

三、如何输出“项目路径”?

以使用pycharm进行py编程为例。 

        3.1项目路径和py文件路径不同

什么是项目路径?比如下图中的【D:\BaiduNetdiskDownload\pythonProject】。

什么是py文件路径?下面的【123.py】文件的路径是【D:\BaiduNetdiskDownload\pythonProject\456\123\123.py】。

可以借助下面四种命令输出该路径,注意要用run功能执行程序文件才会真正地用到【__file__】魔法方法。

print(__file__)  # D:\BaiduNetdiskDownload\pythonProject\456\123\123.py
print(os.path.realpath(__file__))  # D:\BaiduNetdiskDownload\pythonProject\456\123\123.py
print(os.path.abspath(__file__))  # D:\BaiduNetdiskDownload\pythonProject\456\123\123.py
print(os.path.dirname(__file__))  # D:\BaiduNetdiskDownload\pythonProject\456\123

第4行输出,表示dirname()有返回上一级路径的作用,所以不会包括文件名。

         

        3.2输出项目路径有哪些方法?

上面用了四种命令输出当前run的py文件路径,那要输出“项目路径”有什么方法呢?

# 在console/terminal中执行或通过程序文件run执行下列代码,因为console/terminal中的当前路径默认是项目路径

print(os.getcwd())  # 输出当前工作目录
print(os.path.abspath(''))   # 当前项目目录的绝对路径部分
print(os.path.abspath(r".."))  # 当前项目目录上一级的绝对路径,如果要往上两级,可以用r"..\..",以此类推
print(os.path.realpath(""))
print(os.path.dirname(os.path.realpath(""))) # 从输出结果推得:dirname也有上一级目录的作用

# D:\BaiduNetdiskDownload\pythonProject
# D:\BaiduNetdiskDownload\pythonProject
# D:\BaiduNetdiskDownload
# D:\BaiduNetdiskDownload\pythonProject
# D:\BaiduNetdiskDownload

切记要新建一个pycharm console窗口来执行上面的代码,因为这样console窗口的工作路径才是项目路径。标志就是console名称默认为Python Console,而不是某py文件的名称。

不要使用下图的run file in python console指令创建的console窗口来执行上面的指令

因为会像下图那样,把console的当前工作目录设置为filepath。标志是console的名称为某py文件的名称,这时就要注意工作目录并不是项目路径。

四、参考来源

解决NameError: global name '__file__' is not defined_replat-xin-CSDN博客

解决NameError: name '__file__' is not defined的方法_u011727262的博客-CSDN博客

Python中os.path.dirname(__file__)的用法 | WoodenRobot's Blog

物联沃分享整理
物联沃-IOTWORD物联网 » python异常,报错NameError: name ‘__file__’ is not defined怎么解决?

发表评论