【问题标题】:Proper way of importing Python scripts from separate folders从单独的文件夹中导入 Python 脚本的正确方法
【发布时间】:2018-05-24 12:29:34
【问题描述】:

所以很长一段时间以来,我一直在摆弄 Python 并进行一些认真的工作。尽管如此,我仍然偶尔会遇到一些问题。

我发现在使用 Python 时使用PyCharm CE 是最舒服的。典型的场景是我只是创建一个新的virtualenv,启动 PyCharm 并在那里打开我的virtualenv。从那时起,就像自动驾驶一样,PyCharm 处理与使用 site-packages 和 Python 运行时相关的所有脏活。

我总是喜欢保持我的virtualenvs 整洁有序,因此我经常发现自己在语义上将我的源代码组织到子模块/子文件夹中。因此,每当我想从另一个文件夹中导入一些代码、类或其他任何内容时,我只需将其导入即可。

假设我的virtualenv 中有以下结构:

├── bin
├── include    
├── lib           
└── src
    ├── foo.py 
├── important_scripts
    ├── some_script.py
    └── some_other_script.py
└── pip-selfcheck.json

现在,在foo.py 的某个地方,我想使用在some_script.py 中实现的名为A() 的函数。显而易见的方法是在foo.py 中添加一个简单的行——类似于from some_script import A。当我从 PyCharm 运行和调试我的代码(在本例中为 foo.py)时,这样做非常有效。

与我上面描述的典型场景相反,我想从Terminal.app 做同样的事情。所以我启动终端,cd 到我的virtualenv 并激活它。然后,我所做的是,使用我的virtualenv 中bin 文件夹下的Python 可执行文件,我尝试运行foo.py(至少我认为这相当于右键单击并运行@ 987654341@ 来自 PyCharm 窗口)。不幸的是,我收到了错误ModuleNotFoundError: No module named 'some_script'。

我想我遗漏了一个简单的细节或其他东西。因为就像我说的,当从 PyCharm 运行时,它就像魔术一样工作。

无论如何,我们将不胜感激任何建议或帮助。提前致谢。

【问题讨论】:

标签: python terminal pycharm virtualenv


【解决方案1】:

感谢所有可能的解决方案的回复和参考。在网上进行研究时,我遇到了与人们在导入模块和包时或多或少相同的问题的各种实例。所以,这就是我刚刚解决的方法:

  • 在important_scripts 目录下,我包含了一个名为__init__.py 的文件。这基本上只是告诉 Python 解释器这确实是一个 Python 包,而不是一个普通的子目录。
  • 在这个__init__.py中,我已经添加了一行

    from important_scripts.some_script import A 
    
  • 然后在脚本中,我将从其中导入函数A,即foo.py,我已包含以下几行:

    import os
    import sys
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    

    基本上将virtualenv 附加到site-packages 中。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2021-04-17
    • 2021-10-15
    • 1970-01-01
    • 2016-02-01
    • 2023-03-30
    相关资源
    最近更新 更多