从单独的文件夹导入 Python 脚本的正确方法

Proper way of importing Python scripts from separate folders

所以我已经摆弄了很长一段时间,并用 Python 进行了一些认真的工作。尽管如此,我仍然时不时地遇到一些问题。

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

我总是喜欢保持我的 virtualenv 整洁有序,所以我经常发现自己在语义上将我的源代码组织成 submodules/subfolders。因此,每当我想导入一些代码,或 class,或其他文件夹中的任何内容时,我只需导入它即可。

假设我的 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 并激活它。然后,我所做的是,使用 virtualenvbin 文件夹下的 Python 可执行文件,我尝试 运行 foo.py(至少这个就是我认为相当于右击和 运行ning foo.py 从 PyCharm window)。不幸的是,我收到错误 ModuleNotFoundError: No module named 'some_script'.

我想我遗漏了一个简单的细节之类的。因为就像我说的,当 运行 来自 PyCharm.

时,它就像魔术一样工作

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

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

  • 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.