加载文件:
使用相对路径加载文件时,叠加调用后,会因为工作目录的不同,导致相对路径转绝对路径后,会报找不到文件错误。
调用模块:
会出现引用的包,在pycharm跳转查看是正常的,但是运行会报错的问题:ModuleNotFoundError(找不到模块错误)。
解决python导入自定义模块报错ImportError: No module named XXX
Pycharm中Run窗口、Terminal窗口、Python Console窗口的区别及其切换方法
-other
-hello.py
print("hello")
-pyPath
-test.py
import os
import sys
import numpy as np
print("test.py======================================")
print("当前的工作目录:\n", os.getcwd())
print("python搜索模块的路径集合:", )
for path in sys.path:
print(path)
file_path = os.path.dirname(__file__)
def test():
# embedding_matrix = (np.load("model/read.npy")) # 运行test.py文件时,报错;运行main.py文件时,正常
embedding_matrix = (np.load(file_path + "/read.npy")) # 与上面相反
print(embedding_matrix)
print("test end!")
if __name__ == '__main__':
test()
-read.npy
-main.py
import os
import sys
# In[ ]
print("main.py======================================================")
print("当前的工作目录:\n", os.getcwd())
print("python搜索模块的路径集合:", )
for path in sys.path:
print(path)
# In[ ]
# file_path = os.path.dirname(__file__)
# root_path = os.path.abspath(file_path).split('src')
# sys.path.extend([root_path[0] + 'src'])
# In[ ]
from practice.pyPath.model import test
test.test()
print("main.py======================================================")
print("当前的工作目录:\n", os.getcwd())
# In[]
from other import hello
目录结构:
-other
-hello.py
-pyPath
-test.py
-read.npy
-main.py
在pycharm中运行python代码的方式:
Run 'xxx'
Run File in Python Console
Execute Cell in Console
(使用# In[ ]:
点击该行左边的绿色三角形按钮运行)
结果会出现在Python Console窗口(是被选中的那个,不会创建一个新的Python Console,新Python Console需要运行前就创建并选中)
只调用对应模块,不执行被调用的python文件(module、模块)的其他顺序语句
比如写在被调用python文件的一些用于调试信息的语句
命令行运行
pycharm窗口的不同:
python默认运行窗口的切换:
在Run->Edit Configuration
中的Execute
栏勾选:Run with Python Console
(默认为勾选状态)
wdir
和系统路径sys.path
1. 工作目录
os.getcwd() # 获得当前工作目录
os.chdir('设置工作目录')
不同运行方式的工作目录:
命令行运行(Terminal窗口):你的Terminal当前路径
Run File in Python Console
方式Run xxx(Run窗口):你运行的python文件所在目录
Run File in Python Console(Python Console窗口):你运行的python文件所在目录
Execute Cell in Console(Python Console窗口):
可以使用os.getcwd()
查看
用于读写文件
使用相对路径时,由于多层调用,即工作目录的不同,而导致找不到文件
解决办法:
采用相对路径转绝对路径的方式
path = os.path.dirname(__file__)
print('__file__.dir', os.path.dirname(__file__)) # 获取脚本所在目录
file_path = path + file_name
2. 系统路径
print("python搜索模块的路径集合:", )
for path in sys.path:
print(path)
不同运行方式的系统路径包含:
命令行运行(Terminal窗口):
没有src目录和procject目录(就是pycharm会自动添加这两个系统路径)
你运行的python文件(脚本)所在目录
python环境变量(比如anaconda虚拟环境的python环境依赖路径)
通常做法
添加src
目录到系统路径
file_path = os.path.dirname(__file__)
root_path = os.path.abspath(file_path).split('src')
sys.path.extend([root_path[0] + 'src'])
Run xxx(Run窗口):你运行的python文件所在目录
Run File in Python Console(Python Console窗口):
Execute Cell in Console(Python Console窗口):
可以使用os.getcwd()
查看
没有运行的python文件所在目录
系统路径的优先级(由高往低,即sys.path
的顺序):
用于加载模块
pycharm默认添加project、source root这两个系统路径:
在Run->Edit Configuration
中的Environment
栏:
Add content roots to PYTHONPATH
Add source roots to PYTHONPATH
mark directory as sources root
的src
目录(默认为勾选状态;在Run窗口和Python Console窗口会自动添加;在Terminal窗口不会自动添加)
Understanding Python imports, _init_.py and pythonpath — once and for all
《面试官一个小时逼疯面试者》之聊聊Python Import System?
模块和包:
模块:单个python脚本,即一个python文件
包:模块的集和
__init__.py
文件的目录__init__.py
__init__.py
中也可以使用from import
语句导入其他目录的模块__init__.py
文件的目录导入:
import module4 # 隐式相对导入
from . import module4 # 显式相对导入
from package2 import module4 # 绝对导入
绝对导入
相对导入
相对系统路径导入,被淘汰,会有各种路径问题出现
隐式相对导入
显式相对导入
致命的小问题:
即目录名和模块名(python文件名)重名时,
由于系统路径(sys.path
)的优先级的缘故(首先会在执行脚本的所在目录搜索,然后是python依赖环境,最后是自己添加的project目录和src目录。就是sys.path
列表元素的排列顺序)
会直接
工作目录会依据在terminal的路径而变化;
工作目录用于加载(读写)文件,要想在哪里都正确加载,就应该采用相对转绝对的方式
系统路径最高优先级的路径就是要运行的python文件(脚本)的位置,不会变化;
命令行运行时,最好进入到脚本所在目录运行,这样符合加载文件时采用相对路径写法的逻辑。
系统路径用于导入调用依赖,一般优先级是:首先会在执行脚本的所在目录搜索,然后是python依赖环境,最后是自己添加的project目录和src目录
调用时,尽量检查目录和目录下python文件的重名情况。
加载、读写:
final_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "相对路径(相对当前所在路径)"))
导入、调用:
# print("python搜索模块的路径集合:", )
# for path in sys.path:
# print(path)
root_path = os.path.abspath(os.path.dirname(__file__)).split('src')
sys.path.extend([root_path[0] + 'src'])