首先看
set PYTHONPATH=c:\myproject;c:\myproject\mylib是在命令行输入。 ide 怎么设置呢
import xxx
for xx import xx都是绝对导入。
都是根据sys.path去找。
然后看 ,对于按照第一篇博客讲的,对于下面这一个博客,还是会不明白,不要紧先大体看一遍
Python中import的用法总结_import在python中的用法-CSDN博客
应该是按照第一篇博
对于这个错误
main.py运行导入bb时,bb中 import cc是在运行脚本(main.py)所在的目录找有没有cc,在sys.path列出的目录下找有没有cc(不会在拼接目录,因为不是fromxximportcc,),当然找不到。
为什么 bb.py 中的from . import cc 可以找到 。main.py在Pythonprojectt目录 此时.不应该是Pythonproject吗 ?
在
bb.py
中,from . import cc
的 “.
” 表示的是 当前模块的包,也就是branch
包,而不是根据运行的入口文件(main.py
)来决定的。从当前模块所在的包导入cc
那为什么 “.” 是相对于 branch,不是运行的入口文件的目录?
这是 Python 的导入机制中的一个关键点:
Python 中的每个模块都有一个特殊变量
__package__
。当你运行
main.py
,Python 会导入 branch.bb
,此时bb.py
的__package__ = 'a'
。所以
from . import cc
会被理解为:from branch import cc
。
解释
不能直接运行含相对导入的模块!
通过 -m
参数 执行某个模块,那么 当前工作目录
会被加到 sys.path
中作为模块搜索路径。
-m
后面要的是“模块名”,不是文件路径,也不能用相对名(如 .\main.py
)
-
-m
→ 告诉解释器“用 模块/包名 的形式运行” -
Python 把当前目录(
D:\zhouj\Documents\Pythontest
)加进sys.path[0]
-
在这个目录下找到
Project1
文件夹,把它当作一个包 -
在这个包里找到
main.py
模块 -
执行
main.py
文件里的代码
(.venv) PS D:\zhouj\Documents\Pythontest\Project1> python -m main
-
这时候
sys.path[0] = 当前目录Project1
。 -
Python 在这个路径里找到
main.py
。 -
它认为正在运行的模块名是
main
(顶层模块)。 -
所以
__package__ = "main" 这个包没有branch包
cd Pythontest python -m Project1.main
-
这时候
sys.path[0] =当前目录 Pythontest
。 -
Python 在这里找到
Project1
目录,把它当成一个包。 -
它认为正在运行的模块名是
Project1.main
。 -
所以
__package__ = "Project1"
。 -
当执行到
from .branch import cc
:-
.
当前模块所在的包Project1
-
Python 会去
Project1/branch
找cc
。
-
Pycharm 如何寻找导入的模块?
在pycharm 可以运行 但是在命令行不可以运行 因为pycharmsys.path有项目根目录。
pycharm add content roots to PYTHONPATH
Add source roots to PYTHONPATH
#Python中的包
#包(python package)是一个分层次的目录(directory)结构,它将一组功能相近的模块组织在一个目录下
#作用:1.代码规范,2.避免模块名称冲突
#包与目录的区别
#包含__init__.py文件的目录称为包
#目录通常不包含__init__.py文件
#包的导入
#import 包名.模块名
#在demo中导入包:demo2中的模块:modelA
import demo2.modelA
print(demo2.modelA.a)
import demo2.modelA as s#导入包:demo2中的模块:modelA起别名为s
#s是demo2.modelA的别名
print(s.a)
###############################################
'''导入带有包的模块时的注意事项
使用import方式进行导入时,只能根报名或模块名
import clc
import demo2
使用from impor导入时可以导入包,模块,函数,变量等
from demo2 import modelA导入包demo2中的模块a
from demo2.modelA import a导入包demo2中的模块modelA的a
'''