python - 在 python v. IPython 中导入本地模块
问题描述
我发现 IPython 和 python 以不同方式处理本地模块的加载,我想知道是否有人可以解释为什么会发生这种情况。
假设我的项目结构如下:
top_level/
src/
a.py
b.py
__init__.py
的内容b.py
是:
from src.a import foo
foo()
然后a.py
有一个功能foo
:
def foo():
print('It worked!')
文件__init__.py
为空白。
如果我从中调用 ipython 和 python,top_level
我会得到两个不同的结果:
为什么一个有效而另一个无效?是否有可能使 python 处理类似于 IPython 或者是否有更 Pythonic 的方式来处理这样的情况?
版本信息:
- 蟒蛇:3.6.3
- IPython:6.1.0(带有 3.6.3 Python)
编辑以解释与“如何导入本地模块?”的区别 这个问题是关于 IPython 和 Python 如何处理本地模块导入之间的差异,而不是如何导入本地模块。
我还应该补充一点 - 虽然如果我将 import 语句更改为我的示例确实可以工作from a import foo
- 我(隐含地)试图避免这样做。我喜欢导入与某个顶级目录相关的所有内容的想法,以便在文件结构发生变化时更容易。例如,如果b.py
从某个子目录移至src
某个子目录,src/core
那么您需要遍历并重写所有相对于b.py
.
解决方案
我无法向您解释为什么会发生这种情况,但是如果您使文件看起来像这样,它也许可以在python上运行:b.py
from a import foo foo()
对我来说,使用是没有意义的,src.a
因为src
是(相同的)目录。但同样,我不知道为什么一个有效而另一个无效。
请参阅此答案的第三个示例
推荐阅读
- javascript - Wordpress 在另一个 Js 文件中加载 JS 文件
- java - 绑定 2 个不同的应用程序 GET 端点
- python - 如何从单独的列表中删除特定 libsvm 值的列表
- node.js - 在 Minio 上上传带有预签名放置对象链接的元数据
- php - 检查当前时间不在两个时间之间
- sql-server - Azure SQL Server 数据库查看权限
- sql-server - 典型递归中的意外数据
- parsing - 如何使用 Apache Tika 在一行中导出段落
- mysql - macOS更新后Mysql不断重启/关闭
- sequelize.js - 在 Sequelize 中计算列的数据