起因:
今天在学习tensorflow的参数传入tf.flags时, 写了一个简单的测试代码,随意命名为abc.py,放在desktop目录下准备进行测试。
问题:
结果在该目录下输入python的任意指令都会报错如下:
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
File "/home/tk/.conda/envs/py35/lib/python3.5/io.py", line 52, in <module>
File "/home/tk/Desktop/abc.py", line 3, in <module>
ImportError: No module named 'tensorflow'
看到这个报错当时很懵逼,ImportError显然是不存在的。
解决过程:
于是去百度搜了一下
Fatal Python error: Py_Initialize: can't initialize sys standard streams
找到一个答案说先在终端输入
PYTHONPATH=“”
再执行python指令。
试了一下,果然没有问题,成功。
回答问题的人把问题归结为conda 新建的虚拟环境的PYTHONPATH冲突,我觉得不怎么对。
因为我在其他路径执行python是没有问题的,我觉得是路径的问题。
再搞了一阵,得不到解决之后,突然开窍了,
去看了一下/home/tk/.conda/envs/py35/lib/python3.5/io.py的源代码,问题迎刃而解。
io.py 的52行,是
import abc
于是,我在py35/lib/python3.5文件夹下找到了abc.py。
我晕,原来abc除了是个卫生巾的牌子,还是个python的自建模块,还是自己基础知识掌握的不牢啊。。
我在Desktop目录下执行python, io.py这个文件import的是我Desktop下的abc.py ,所以出了问题。
我把desktop下的abc.py改成其他名字,果然莫得问题了。
但是为什么在运行之前输入PYTHOHPATH=""也可以呢?
我分别在PYTHONPATH=“”和不做这个操作的情况下进入python终端,查看path,
import sys
sys.path
正常情况下,python会把当前路径(pwd)和你自定义的python环境变量加入path,而且顺序在默认路径之前。
而输入PYTHONPATH=""之后,只有python的默认路径了。
这下彻底明白咯。
我desktop下的那个py文件改回abc.py,但是终端cd到其他路径与运行 Desktop/abc.py,果然莫得问题了。
这时我想到了 future 模块的absolute_import , 我在io.py 文件中加入
from __future__ import absolute_import
我天真的以为,这时候python会略过当前文件路径的模块了,
结果失败,因为这个指令是让python调用sys.path路径的模块,
然而,在Desktop下运行python,该路径已经被加入到sys.path了。
总结
1.py文件,模块文件命名尽量避免与系统模块冲突;
2.在终端运行Python之前,可以设置PYTHONPATH=“xxx” 加入想要加入的path,就像pycharm的"mark directory as source root"功能差不多吧。
网友评论