使用 jupyter notebook 写代码的时候需要获取文件的绝对路径,同时需要在将 notebook 文件使用nbconvert 转换为 py 脚本后也能正常使用,但是现有的很多方法都没有办法在 notebook 和 py 脚本之间同时使用,下面是基于 notebook 的各种获取文件绝对路径的方法的测试:
import inspect
import os
print(os.path.dirname(os.path.abspath(__file__)))
print(os.path.dirname(os.path.abspath('__file__')))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.dirname(os.path.realpath('__file__')))
print(os.getcwd())
print(sys.argv[0])
print(os.path.dirname(inspect.getfile(lambda: None)))
OutPut:
name '__file__' is not defined
/home/yke/Desktop/LiTr/3Extract #正确路径
name '__file__' is not defined
/home/yke/Desktop/LiTr/3Extract #正确路径
/home/yke/Desktop/LiTr/3Extract #正确路径
/home/yke/.conda/envs/opcd/lib/python3.9/site-packages/ipykernel_launcher.py
/tmp/ipykernel_5898
可以看到在 notebook 中,__file__加上引号则能正常使用,引号原因未知。同时getcwd可以正常使用。下面是基于py脚本文件的获取绝对路径的方法测试:
import inspect
import os
print(os.path.dirname(os.path.abspath(__file__)))
print(os.path.dirname(os.path.abspath('__file__')))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.dirname(os.path.realpath('__file__')))
print(os.getcwd())
print(sys.argv[0])
print(os.path.dirname(inspect.getfile(lambda: None)))
Output:
/home/yke/Desktop/LiTr/3Extract #正确路径
/home/yke/Desktop/LiTr
/home/yke/Desktop/LiTr/3Extract #正确路径
/home/yke/Desktop/LiTr
/home/yke/Desktop/LiTr
/home/yke/Desktop/LiTr/3Extract/Test_ExtractTrajectory.py
/home/yke/Desktop/LiTr/3Extract #正确路径
可以看到,在py脚本文件中__file__不加上引号才能正常使用,刚好与notebook中的结果相反,而notebook中能正常使用的 getcwd() 函数也会和加上引号的 "__file__" 的方法一致,刚好缺一层文件夹。国外的老哥也遇到了这样的问题,他的建议是在notebook和py脚本文件中分开使用 "__file__"和 __file__
因此暂时未找到能够同时在notebook和py脚本文件中通用的获取文件绝对路径的方法,欢迎各路大佬指教。