1、关于__init__.py。
一个Python 脚本称之为一个模块,多个Python 脚本构成的一个文件夹,再加上一个__init__.py文件称为一个包。
1)在Python3.3+ 以后,可以不包含__init__.py,称之为 “隐式命名空间包”
2)__init__.py 的本质也是一个脚本,只是这个脚本是在引用这个包名的时候自动运行,可以在这里写一些初始化相关的代码。
参考: https://www.cnblogs.com/tp1226/p/8453854.html
2、os.getcwd()
在Python中可以使用os.getcwd()函数获得当前的路径。需要说明的是
1)当前目录并不是指脚本所在的目录,而是所运行脚本的目录。
2)返回的是运行跟脚本的目录,在跟脚本调用包的模块中使用该命令返回的仍然是跟脚本的运行目录。
3、Python3使用绝对路径和相对路径
1)绝对路径 指 完整的描述文件位置的路径。比如Mac下:/Users/zhangjianhu/Documents/code_dataset_management/sub1/a.txt
实际编程中,我们往往需要程序拥有更强的可移植性。使用绝对路径可能导致 '迁徙系统后,原路径失效'。
2)相对路径 指 相对于所运行脚本的目录的路径,参考os.getcwd的逻辑。
因此实际编程尝试用相对路径,但是就要注意:
相对路径的指的是运行根脚本的路径,因此强烈建议在根脚本所在目录运行跟脚本,不要Python3 XXXX/…./XXXX/根脚本.py 而是cd XXXX/…./XXXX Python3 根脚本.py
4、Python3的绝对引用和相对引用
1)相对导入(relative import)的语句通过使用.或..等相对路径的方式来定位要import的模块/包,基准路径是当前模块所在包.
Python3 剔除了隐式相对引用,即不可以直接import xx, 其中xx为用户自定义的包或者模块。
使用相对导入的文件不能直接以脚本方式运行,只能以模块方式(-m选项)运行,并且当前路径要处于import语句定位的路径或更高层路径。
2)使用完整路径定位模块/包,Python根据sys.path的值逐路径搜索要导入的模块/包,而对于内置的和安装第三方的模块/包,其路径都在sys.path值中。
绝对导入的方式无法导入上级目录的模块,虽然可以通过在程序中改写sys.path追加特定路径的方式规避,但不推荐,会增加风险。
3)为提高代码复用和有效模块化组织,建议使用主程序+包的方式组织项目,其中包内按分层思想放置若干模块,包内模块间使用相对导入(relative import),项目根目录下放置主程序文件。
参考链接:https://zhuanlan.zhihu.com/p/78247846
https://zhuanlan.zhihu.com/p/69099185
https://blog.csdn.net/ning13481193737/article/details/107165586
5、Python3 常见的导入方式:
python导入同级别模块很方便:
import xxx
要导入下级目录页挺方便,需要在下级目录中写一个__init__.py文件
from dirname import xxx
要导入上级目录,可以使用 sys.path(不建议使用,原因见6-1,推荐使用相对路径)
首先 sys.path 的作用是:当使用import语句导入模块时,解释器会搜索当前模块所在目录以及sys.path指定的路径去找需要import的模块
所以改变思路,直接把上级目录加到 sys.path 里
import sys
sys.path.append('../')
from fatherdirname import xxx
6、添加Python path的方式:
1)方法1,直接修改sys.path列表
通过 sys 模块的 append() 方法在 Python 环境中增加搜索路径:
>>> import sys
>>> sys.path.append('/home/wang/workspace')
该方法会使得环境变量在整个Python存在期间(运行append后所有的代码从此代码后开始生效,直至整套脚本停止)
因此并不建议使用
2)方法2,创建.pth文件
另一种修改sys.path的方法时在site-packages目录新建一个.pth文件,帮在文件中加入搜索模块的路径
/root/test
重新启动一个python交互式解释器,输出sys.path,你可以看到/root/test目录也在其中。
3)方法3,设置PYTHONPATH环境变量
第三种修改方法,通过PYTHONPATH环境变量,我使用export 命令设置该环境变量
[root@sheng studyflask]# export PYTHONPATH=/root/studyflask
[root@sheng studyflask]# echo $PYTHONPATH
/root/studyflask
这种设置方法仅仅是为了验证是否凑效,退出终端后,环境变量就会失效,如果你想永久生效,可以在/etc/profile,或者.bashrc中进行设置,设置完PYTHONPATH后,启动一个新的python交互式解释器,输出sys.path
三种方法比较
从灵活性上比较,方法1最为灵活,搜索目录的位置可以通过调用列表的insert方法自由控制,而方法2所添加的搜索目录会加在sys.path的末尾,方法3会加在列表的开头。
从有效范围上比较,方法的生效范围最小,你在脚本里对sys.path进行修改,那么它只对所修改脚本的执行时的进程有效果,其他脚本在执行时不会受到影响,方法2的有效范围就要大一些,假如你有多个python版本,但只在某一个python的site-packages里新建了.pth文件,那么只有当你使用这个python作为启动python脚本的应用程序时,.pth才会生效。生效范围最大的是PYTHONPATH,一旦设置生效,不论你用系统上的哪个python来执行脚本,它都生效,因为python在执行脚本时会自动加载这个环境变量,只要环境变量可以访问,就必然生效。
参考链接:http://www.coolpython.net/python_senior/module_concept/modify-sys-path.html
7、引用时与运行时:
1)定义:
运行时:通过命令行的方式执行python脚本。
引入时:将代码从一个文件首次导入到另一个文件/解释器中。
2)用法:
Python 和 Java C的引用时是不同的,Python 的引用时,基本可以视作做了同运行时几乎一致的操作,简单理解为运行了整个被引用的完整代码。注意有如下注意:
*仅在第一次引用时运行。
*假设引入模块为A,不区分import A, import A.X,from A import *,from A import X (X为某个元素),整个A的都会被执行
*if __name__ == ‘__main__’: 包含的脚本不会在引用时被执行。
*会递归的执行模块内的import
*注意__init__.py 会被自动执行,需要注意里面的code。