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

起因:

今天在学习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

File "/home/tk/Desktop/abc.py", line 3, in

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"功能差不多吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值