xyps 2023-09-12 15:01 采纳率: 42.9%
浏览 12

Python中一个被导入的py文件再导入另一个py文件,怎么做能让两个文件都正常运行

我有一个first.py和second.py在同一个目录下,这个目录叫libs,first.py用“from second impor *”引用了second.py,再在libs的父目录下start.py用“from libs.first import *”引用libs下的first.py,运行start.py会报错:“No module named 'second'”,但是first.py是可以单独正常运行。

如果把first.py中的引用语句改成“from libs.second import *”,单独运行first.py的时候会报错:“No module named 'libs.second'”,但是start.py是正常运行的

路径如下:

img

问题1:怎么引用能让start.py和first.py都可以正常运行

问题2:按照我的理解,start.py在引用first.py以后,first.py应该是按照自己所在的相对路径找second.py,但是事实上是以start.py的相对路径找second.py,所以引用的底层逻辑是什么?为什么会造成这样的结果?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-12 16:35
    关注

    【以下回答由 GPT 生成】

    问题1: 怎样的导入方式能让start.pyfirst.py都可以正常运行?

    解决方案: 可以通过修改first.py的导入语句来解决这个问题。在first.py中,将from second import *改为from .second import *即可。这样修改后,first.py将按照相对路径引用second.py,而不会在start.py的相对路径下查找second.py

    下面是修改后的first.py文件的代码示例:

    from .second import *
    # 其他代码
    

    问题2: 根据我的理解,start.py在引用first.py后,first.py应该按照自己所在的相对路径找second.py,但是实际上是以start.py的相对路径找second.py,那么导入的底层逻辑是什么? 为什么会出现这样的结果?

    回答: 当解释器在导入一个模块时,会按照一定的顺序搜索模块的路径。具体的搜索路径可以通过sys.path查看。其中,相对导入中的点(.)代表当前模块的相对路径。在start.py中导入first.py时,解释器会先搜索当前目录下的libs文件夹,然后搜索全局的搜索路径。但是,在first.py中导入second.py时,由于使用了相对导入,解释器会根据first.py的相对路径来搜索second.py。由于first.pysecond.py位于同一目录下,所以使用from .second import *可以正确找到second.py

    如果不使用相对导入,即from second import *,则解释器会在全局搜索路径中搜索second.py。因此,在start.py中运行时会报错找不到second模块。在first.py中运行时,因为当前目录下没有second.py,所以也会报错找不到second模块。

    通过使用相对导入,可以明确指定相对路径,避免模块搜索路径的问题,从而保证两个文件都可以正常运行。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 9月12日
  • 修改了问题 9月12日
  • 创建了问题 9月12日

悬赏问题

  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口