从单独的文件夹导入 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
并激活它。然后,我所做的是,使用 virtualenv
中 bin
文件夹下的 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
.
所以我已经摆弄了很长一段时间,并用 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
并激活它。然后,我所做的是,使用 virtualenv
中 bin
文件夹下的 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
.