首页 > 编程问答 >尝试跨同一主文件夹下的子文件夹导入文件时出错

尝试跨同一主文件夹下的子文件夹导入文件时出错

时间:2024-07-29 06:55:19浏览次数:14  
标签:python visual-studio-code jupyter-notebook pycharm importerror

我是新来的,希望得到一些帮助。

最近,我一直在使用 Jupyter 笔记本进行一些学习,在这种情况下,测试我从不同文件夹中制作的函数。

最初,结构如下如下:

/Main Folder

   / Library(containinng function)
   Notebook

在这个结构中我可以做

     from Library."file" import "function" 

这总是有效

但是,当我开始将所有笔记本组织在这样的文件夹中

/Main Folder
    /Library
       some.py
    /Notebook
       some.ipynb

而相同 import 将无法工作并返回错误 Module not found: Library

所以我使用copilot来寻求帮助,它给了我这个片段

import sys

# Get the path to the 'library' folder
library_path = os.path.abspath(os.path.join(os.getcwd(), '..', 'library'))

# Append the 'library' folder to sys.path
if library_path not in sys.path:
    sys.path.append(library_path)

现在,当我有这个时,如果我使用与提到的相同的 import ,它仍然无法工作,但是如果我使用|| |它工作得很好,我说好的,不用担心。 from "file" import "function" 所有这些都在 Vs 代码中。然而,在 Pycharm 上,我不需要执行任何操作,当我使用适用于 VsCode 的修复程序时,Pycharm 失败了。所以我认为当代码单元在笔记本中运行时路径的到达方式肯定有问题

但是在普通的python文件上,我可以简单地做

并且无论子文件夹如何,我都可以到达代码没有错误。 sys.path.append(os.path.abspath".") 任何帮助将不胜感激。谢谢

Any help would be appreciated. Thanks


你遇到的问题是 Python 模块搜索路径导致的。简单来说,当你使用 import 语句时,Python 会在特定路径列表中寻找你要导入的模块。这个路径列表存储在 sys.path 中。

问题根源:

  • 工作目录: Jupyter Notebook 和 PyCharm 的工作目录可能与你期望的不同。这会导致相对路径导入出现问题。
  • 相对路径: from Library.file import function 是相对路径导入,它依赖于当前工作目录。

解决方案:

  1. 绝对路径导入: 最稳妥的方法是使用绝对路径导入。 你可以使用 sys.path.append(os.path.abspath("..")) 将上级目录添加到 sys.path ,然后使用绝对路径导入:

```python import sys import os sys.path.append(os.path.abspath(".."))

from Library.file import function ```

  1. 修改 sys.path (不推荐): 你可以直接修改 sys.path ,将模块所在目录添加进去。但这种方法的可移植性较差,不推荐在正式项目中使用。

  2. 创建 Python 包: 将 "Library" 文件夹变成一个 Python 包,并在其中创建 __init__.py 文件。这样,Python 就会将其识别为一个包,你可以使用 from Library.file import function 进行导入。

最佳实践:

  • 使用 Python 包: 这是最规范、可移植性最好的方法。
  • 避免相对路径导入: 尽可能使用绝对路径导入,避免因工作目录变化导致的导入问题。
  • 理解工作目录: 在使用 Jupyter Notebook 或 PyCharm 时,务必了解当前的工作目录,以便正确设置导入路径。

希望以上解释能帮助你理解并解决问题。如果你还有其他疑问,请随时提出。

标签:python,visual-studio-code,jupyter-notebook,pycharm,importerror
From: 78803438

相关文章

  • 如何用Python制作Android服务?
    我想构建一个简单的Android应用程序,例如PushOver应用程序,它具有TCP服务器并接收其记录的文本消息,然后将其作为推送通知发送。这部分已经完成并且工作正常。但即使GUI应用程序关闭,我也想接收消息。我知道这是可能的,因为PushOver应用程序做到了!我想,我可能需要一......
  • Python Discord Bot 的应用程序命令的区域设置名称(多语言别名)
    如何根据用户的语言设置,使应用程序命令的名称具有不同的名称例如,如果一个用户将其discord的语言设置为英语,则用户可以看到英语的应用程序命令名称。另一方面,如果另一个用户将其不和谐语言设置为法语,则用户可以看到法语中的相同应用程序命令的名称。为此,我尝试使用ap......
  • 如何在Python中添加热键?
    我正在为游戏制作一个机器人,我想在按下热键时调用该函数。我已经尝试了一些解决方案,但效果不佳。这是我的代码:defstart():whileTrue:ifkeyboard.is_pressed('alt+s'):break...defmain():whileTrue:ifkeyboard.is_pr......
  • 在Python中解压文件
    我通读了zipfile文档,但不明白如何解压缩文件,只了解如何压缩文件。如何将zip文件的所有内容解压缩到同一目录中?importzipfilewithzipfile.ZipFile('your_zip_file.zip','r')aszip_ref:zip_ref.extractall('target_directory')将......
  • 如何在Python中从RSA公钥中提取N和E?
    我有一个RSA公钥,看起来像-----BEGINPUBLICKEY-----MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAvm0WYXg6mJc5GOWJ+5jkhtbBOe0gyTlujRER++cvKOxbIdg8So3mV1eASEHxqSnp5lGa8R9Pyxz3iaZpBCBBvDB7Fbbe5koVTmt+K06o96ki1/4NbHGyRVL/x5fFiVuTVfmk+GZNakH5dXDq0fwvJyVmUtGYA......
  • Swagger、Docker、Python-Flask: : https://editor.swagger.io/ 生成服务器 python-fl
    在https://editor.swagger.io/上您可以粘贴一些json/yaml。我正在将此作为JSON进行测试(不要转换为YAML):{"swagger":"2.0","info":{"version":"1.0","title":"OurfirstgeneratedRES......
  • 使用 Matplotlib 的 Python 代码中出现意外的控制流
    Ubuntu22.04上的此Python3.12代码的行为符合预期,除非我按q或ESC键退出。代码如下:importnumpyasnp,matplotlib.pyplotaspltfrompathlibimportPathfromcollectionsimportnamedtuplefromskimage.ioimportimreadfrommatplotlib.widgets......
  • 参考 - Python 类型提示
    这是什么?这是与在Python中使用类型提示主题相关的问题和答案的集合。这个问题本身就是一个社区维基;欢迎大家参与维护。这是为什么?Python类型提示是一个不断增长的话题,因此许多(可能的)新问题已经被提出,其中许多甚至已经有了答案。该集合有助于查找现有内容。范......
  • 我的 Python 程序中解决 UVa 860 的运行时错误 - 熵文本分析器
    我正在尝试为UVa860编写一个解决方案,但是当我通过vJudge发送它时,它一直显示“运行时错误”。fromsysimportstdinimportmathdefmain():end_of_input=Falselambda_words=0dictionary={}text_entropy=0relative_entropy=0whilenotend_of_in......
  • Python进度条
    当我的脚本正在执行某些可能需要时间的任务时,如何使用进度条?例如,一个需要一些时间才能完成并在完成后返回True的函数。如何在函数执行期间显示进度条?请注意,我需要实时显示进度条,所以我不知道该怎么办。我需要thread为此吗?我不知道。现在在执行函数......