pycharm运行py之路径、导入问题

文章目录

  • pycharm运行py之路径、导入问题
    • ref
    • 实验
    • 总结
      • 一、运行方式和pycharm窗口
      • 二、工作目录`wdir`和系统路径`sys.path`
      • 三、模块、包的导入
      • 四、大总结

pycharm运行py之路径、导入问题

加载文件:

使用相对路径加载文件时,叠加调用后,会因为工作目录的不同,导致相对路径转绝对路径后,会报找不到文件错误。

调用模块:

会出现引用的包,在pycharm跳转查看是正常的,但是运行会报错的问题:ModuleNotFoundError(找不到模块错误)。

ref

解决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窗口

在pycharm中运行python代码的方式:

  • Run 'xxx'

    • 结果会出现在Run窗口
  • Run File in Python Console

    • 结果会出现在Python Console窗口
    • **会顺序执行被调用的python文件(module、模块)的顺序语句之后,**再调用相应的函数、变量
      • **if name == ‘main’*以下的语句在模块被调用时不会执行
  • Execute Cell in Console(使用# In[ ]:点击该行左边的绿色三角形按钮运行)

    • 结果会出现在Python Console窗口(是被选中的那个,不会创建一个新的Python Console,新Python Console需要运行前就创建并选中)

    • 只调用对应模块,不执行被调用的python文件(module、模块)的其他顺序语句

      比如写在被调用python文件的一些用于调试信息的语句

  • 命令行运行

    • 结果会出现在Terminal窗口

pycharm窗口的不同:

  • Run
    • 只显示运行结果,不能执行其他操作
  • Python Console
    • python的交互模式,会保留运行过程中的变量,可以在窗口继续编写代码并执行
  • Terminal
    • 就是命令行终端。不光可以执行python脚本,还可以执行其他系统命令语句。

python默认运行窗口的切换:

Run->Edit Configuration中的Execute栏勾选:Run with Python Console

(默认为勾选状态)

二、工作目录wdir和系统路径sys.path

1. 工作目录

os.getcwd() # 获得当前工作目录
os.chdir('设置工作目录')
  • 不同运行方式的工作目录:

    • 命令行运行(Terminal窗口):你的Terminal当前路径

      • 一般会进入到要运行的python文件的位置,所以等同于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()查看

      • 新的未使用的Python Console窗口:是你的project目录
      • 旧的已使用的Python Console窗口:继承已有的工作目录
  • 用于读写文件

    • 使用相对路径时,由于多层调用,即工作目录的不同,而导致找不到文件

    • 解决办法:

      • 采用相对路径转绝对路径的方式

        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文件所在目录

      • 你运行的python文件所在目录
      • python环境变量(比如anaconda虚拟环境的python环境依赖路径)
      • 你的project目录
      • 你的src目录
      • pycharms_help路径
    • Run File in Python Console(Python Console窗口):

      • 你运行的python文件所在目录
      • python环境变量(比如anaconda虚拟环境的python环境依赖路径)
      • 你的project目录
      • 你的src目录
      • pycharms_help路径
    • Execute Cell in Console(Python Console窗口):

      可以使用os.getcwd()查看

      没有运行的python文件所在目录

      • 新的未使用的Python Console窗口:
        • python环境变量(比如anaconda虚拟环境的python环境依赖路径)
        • 你的project目录
        • 你的src目录
        • pycharms_help路径
      • 旧的已使用的Python Console窗口:
        • 继承已有的系统路径
        • 你的project目录
        • 你的src目录
  • 系统路径的优先级(由高往低,即sys.path的顺序):

    • 当前所在目录
    • python环境依赖
    • project目录和src目录
  • 用于加载模块

    • 具体见第三部分

pycharm默认添加project、source root这两个系统路径:

Run->Edit Configuration中的Environment栏:

  • Add content roots to PYTHONPATH
    • 就是project目录
  • Add source roots to PYTHONPATH
    • 就是被mark directory as sources rootsrc目录

(默认为勾选状态;在Run窗口和Python Console窗口会自动添加;在Terminal窗口不会自动添加)

三、模块、包的导入

Understanding Python imports, _init_.py and pythonpath — once and for all

《面试官一个小时逼疯面试者》之聊聊Python Import System?

模块和包:

  • 模块:单个python脚本,即一个python文件

  • 包:模块的集和

    • 常规包(regular packages)
      • 包含__init__.py文件的目录
      • 会首先运行__init__.py
      • __init__.py中也可以使用from import语句导入其他目录的模块
    • 命名空间包(Namespace Packages)
      • 不包含__init__.py文件的目录

导入:

import module4 # 隐式相对导入
from . import module4 # 显式相对导入
from package2 import module4 # 绝对导入
  • 绝对导入

    • 相对project目录导入,在python3以后使用该规则,包名过长,不好改,不好用。
  • 相对导入

    • 相对系统路径导入,被淘汰,会有各种路径问题出现

      • 隐式相对导入

      • 显式相对导入

致命的小问题:

即目录名和模块名(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'])

你可能感兴趣的:(#,pycharm,python,pycharm,python,python,path,python,import,导入导包调用)