专栏首页烟草的香味Python导入运行的当前模块报错

Python导入运行的当前模块报错

引言

今天遇到了一个奇怪的现象,简单举个栗子:

文件结构如下:

其中tt.py文件中定义了一个方法:

def tt():
    print('tt')

我现在要在test.py中使用tt(), 代码如下:

from test.tt import tt

if __name__ == '__main__':
    tt()

以上导入模块是编译器自动导入的,运行后直接报错:

说没有找到这个模块,然后我将导入换成相对路径

可以看到编译器是有报错提示的,但是运行完全没有问题。

将路径换成相对路径试试呢?

很好,编译器是认识的,但是不好意思运行报错

那么问题来了,问什么编译器的自动导包会出现问题呢?这编译器也太不智能了。

探究

众所周知,Python模块导入的查找路径可以通过sys.path查看,我看了一下:

['/home/hujing/workspace/python/python_demo/test', '/home/hujing/workspace/python/python_demo', '/usr/share/pycharm/helpers/pycharm_display', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/hujing/.local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages', '/usr/share/pycharm/helpers/pycharm_matplotlib_backend']

在第一个路径下找tt可以找到,这也是上面正确运行的,没有问题

在第二个路径下找test.tt,应该也可以找到啊,为什么会提示找不到呢?

相对路径查找为什么也找不到呢?在网上找了找,没有找到能够解决我问题的答案,那我就只好自己探究了。

尝试

首先,无法导入本包下的其他模块,尝试在其他模块中导入:

新建模块并导入刚才的test模块, 文件结构如下:

其中fun_test.py文件只有一句:import test.test

先尝试一下刚才运行的模式:

不出意外会报错,因为运行路径已经换到fun目录下了,果不其然

再尝试一下刚才编译器的做法:

正常:

相对路径经过尝试也是正常的。

思考

那我就奇怪了,为什么换个模块运行就可以。就不能正常导入自己包的模块吗?还是说python没有把运行路径当做包?

我觉得应该是后者,Python不会将执行的文件路径作为一个包来处理,在我经过一些其他的尝试之后,暂时看到的确实是这样。故而也就无法通过导入包的形式来导入了。

这只是我经过尝试,暂时得出的粗浅结论,目前还没有找到相关内容的说明,若哪位了解,还望不吝赐教。

项目路径

再有一个问题,Pycharm中运行正常,但是使用cmd直接运行就会报错,很简单,输出sys.path,可以看到两者的不同,Pycharm非常贴心的讲我们项目的运行根路径添加进去了,在命令行运行就需要手动添加了。当然,你也可以选择讲各种自己的包都放到系统路径下,或者直接在系统路径下添加项目路径。

本文分享自微信公众号 - 烟草的香味(hujing-bc),作者:胡靖哥哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java集合之Vector源码分析

    Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronize...

    烟草的香味
  • 缓存在高并发场景下的常见问题

    当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策...

    烟草的香味
  • 23种设计模式之策略模式

    策略模式的重点就是封装角色, 它借用了代理模式的思路, 差别就是策略模式的封装角色和被封装的策略类不用是同一个接口, 如果是同一个接口就成了代理模式

    烟草的香味
  • 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作

    系统回顾           前面的四篇文章我详细的介绍了AgileEAS.NET平台中统一数据访问(UDA)组件的用法,分析了两种数据处理流程的优缺点,以及基...

    魏琼东
  • LDAP认证服务器

    1.要准备的环境与软件(这里测试环境是Centos6.0-64位系统) alfresco-community-4.2.c-installer-linux-x64...

    py3study
  • Android Scroller用法

    两者作用一样都是通知UI刷新,但是invalidate只能在UI线程中调用,postInvalidate则在非UI线程中调用

    剑行者
  • 生信主管应该了解的十个Linux知识点

    linux的发行版非常多,其实本质上差别不大,哪怕是mac的OS应该是也是同样的管理操作模式。以下针对于ubuntu适用,当然ubuntu本身也有版本的区别,目...

    生信技能树
  • iOS 9 Storyboard 教程(二下)

    现在你会忽视Game行,仅仅让用户输入玩家的名字. 当用户点击Cancel按钮的时候,这个控制器将会关闭并且不管你输了什么数据都不会保存.这个部分用unwin...

    hrscy
  • 治理诈骗源头,腾讯安全做了这些事

    守护者计划,是腾讯践行“科技向善”使命,联合政府、企业等社会各界力量构筑的网络安全生态体系。旨在用科技为公民信息安全提供全方位保护,协助司法机关打击网络黑产及其...

    腾讯安全
  • 美国最好的AI和计算机研究生项目都在这儿了 | USNews最新排名

    USNews最新的研究生院排名今天发布了,刷论文调模型之余,这个(比较)权威的榜单还是要了解一下滴。

    量子位

扫码关注云+社区

领取腾讯云代金券