which python2.7
/usr/bin/python2.7
$which python
/usr/bin/python
$which python3
/usr/local/bin/python3
$python –version
Python 3.6.0
命令行运行python 执行的事python3
php 的exec(“python –version”,$outPut,$return);
运行的是python
python 2 和3 import 、print等 不兼容,导致
通过php能运行成功,但是直接命令行就失败
使用python内置工具2to3.py对代码进行批量修改
在mac上
2to3 -w .
Mac系统上:
安装完python3后,2to3可以作为指令直接执行,-w代表”Write back modified files”,”.”代表当前整个文件夹,可以将”.”换成单个.py文件或者文件夹名:
$ 2to3 -w . //将当前整个文件夹代码从python2转到python3
完成后,原python2文件会在.py后面再加上一个后缀.bak,而新生成的python3文件使用之前python2文件的命名。
可以使用以下命令查看2to3可以选择的参数:
$ 2to3 -help
Windows系统上:
需要进入python3的安装目录,进入Tools/scirpt目录,找到“2to3.py”脚本。假设python3的安装目录为“E:\Python\Python36”,则2to3.py文件所在路径为“E:\Python\Python36\Tools\scripts”。
https://www.cnblogs.com/wuliytTaotao/p/9459840.html
一般模块导入规则:
import xxx 时搜索文件的优先级如下:
⭐
1.在当前目录下搜索该模块
2.在环境变量 PYTHONPATH 中指定的路径列表中依次搜索
3.在 Python 安装路径的 lib 库中搜索
在 Python 程序启动时进行配置,自动将 top-level file 的 home 目录(或用一个’‘表示当前工作目录)、PYTHONPATH 设置的目录、.pth 文件里的目录、标准库目录合并成一个 list ,组成每次 import 时 Python 搜索的目录列表,放到sys.path 中
Python import 的步骤:
python 所有加载的模块信息都存放在 sys.modules 结构中,当 import 一个模块时,会按如下步骤来进行
如果是 import A,检查 sys.modules 中是否已经有 A;如果有则不加载,如果没有则为 A 创建 module 对象,并加载 A
如果是 from A import B,先为 A 创建 module 对象,再解析A,从中寻找B并填充到 A 的 dict 中
Python中的绝对导入与相对导入:
相对导入与绝对导入,这两个概念是相对于包内导入而言的。包内导入即是包内的模块导入包内部的模块。
所谓的包,就是包含 init.py 文件的目录,该文件在包导入时会被首先执行,该文件可以为空,也可以在其中加入任意合法的 Python 代码。
相对导入可以避免硬编码,对于包的维护是友好的。绝对导入可以避免与标准库命名的冲突,实际上也不推荐自定义模块与标准库命令相同。
绝对导入:指明顶层 package 名。比如 import a,Python 会在 sys.path里寻找所有名为 a 的顶层模块。
⭐
import A.B
或
from A import B
相对导入:在不指明 package 名的情况下导入自己这个 package 的模块,表示只在 package 的内部目录中搜索,并且不会搜索位于 sys.path 上某处同名的模块,直接效果就是包模块覆盖了外部的模块。
⭐
from . import B
或
from ..A import B
比如一个 package 下有 a.py 和 b.py 两个文件,在 a.py 里 from . import b 即是相对导入 b.py。
⭐
from . import b
Q: 为什么能在 b.py 中 import a 呢?
A: 这是因为这两个文件所在的目录不是一个包,那么每一个 python 文件都是一个独立的、可以直接被其他模块导入的模块。就像导入标准库一样,它们不存在相对导入和绝对导入的问题。相对导入与绝对导入仅用于包内部。
Python2.x 默认为相对路径导入,Python3.x 默认为绝对路径导入。
绝对导入可以避免导入子包覆盖掉标准库模块(由于名字相同,发生冲突)。
如果在 Python2.x 中要默认使用绝对导入,可以在文件开头加入如下语句:
⭐
from future import absolute_import
需要注意的是文件夹被python解释器视作package需要满足两个条件:
1.文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。
2.不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。
所以,当用.. 或 ../..返回上级去导入的时候,如果到了程序的入口就会报错:ValueError: attempted relative import beyond top-level package
这是因为第2条的原因,也就是相对导入的时候不能返回到顶层目录去导入,否则会报错。
所以,用绝对导入的人比较多,相对导入中一个点(同级导入)用的比较多。
https://www.zhihu.com/question/50979825
https://www.cnblogs.com/shengulong/p/10176903.html
https://www.cnblogs.com/shengulong/p/10176903.html
https://blog.csdn.net/Blateyang/article/details/89492570
https://www.jb51.net/article/52075.htm
https://blog.csdn.net/u010138758/article/details/80152151