美文网首页
问题记录,关于PYTHONPATH和abc.py

问题记录,关于PYTHONPATH和abc.py

作者: Koap | 来源:发表于2019-07-19 15:59 被阅读0次

    起因:
    今天在学习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"功能差不多吧。

    相关文章

      网友评论

          本文标题:问题记录,关于PYTHONPATH和abc.py

          本文链接:https://www.haomeiwen.com/subject/ietslctx.html