我对Python很陌生,所以听起来很明显,但我还没有在其他地方找到它
说我在directoy A中有一个应用程序(模块)/然后我开始在另一个目录中开发一个应用程序/模块B /
现在我有
source/
|_A/
|_B/
从B我想使用函数是在B中定义的类。我可能最终将它们拉出来并将它们放在“misc”或“util”模块中。
在任何情况下,添加到PYTHONPATH模块B的最佳方法是什么,以便A可以看到它?考虑到我也将对B进行更改。
到目前为止,我想出了类似的内容:
def setup_paths():
import sys
sys.path.append('../B')
当我想在A中开发一些使用B的东西但这感觉不对。
答案 0 :(得分:3)
通常,当您开发单个应用程序时,您的目录结构将类似于
src/
|-myapp/
|-pkg_a/
|-__init__.py
|-foo.py
|-pkg_b/
|-__init__.py
|-bar.py
|-myapp.py
这使得整个项目可以被其他人重新用作包。在myapp.py
中,您通常会有一个简短的main
功能。
您可以轻松导入应用程序的其他模块。例如,在pkg_b/bar.py
您可能有
import myapp.pkg_a.foo
我认为这是组织进口的首选方式。
如果您真的需要,可以进行相对导入,PEP-328中描述了它们。
import ..pkg_a.foo
但我个人认为,它们有点丑陋且难以维护(当然,这是有争议的)。
当然,如果你的某个模块需要来自另一个应用程序的模块,那么这是一个完全不同的故事,因为这个应用程序是一个外部依赖项,你必须处理它。
答案 1 :(得分:0)
我建议使用imp
模块
import imp
imp.load_source('module','../B/module.py')
否则使用从根开始的绝对路径
def setup_paths():
import sys
sys.path.append('/path/to/B')
答案 2 :(得分:0)
将适当的文件夹添加到PYTHONPATH
首先,为您创建的包创建根目录。我们称之为project
。
project
的子目录是您的应用,即A
和B
。现在,您必须将project
的父目录添加到PYTHONPATH
。
引用包装内的模块。
假设您在B中有other_app.py
,那么在A/app_name.py
中您可以像这样导入它:
from project.B.other_app import *
或者,如果您希望other_app
命名空间中的所有符号都像这样导入:
from project.B import other_app
创建发射器并动态更改PYTHONPATH的好方法
如果您想为Python创建通用应用程序启动程序,即使将程序包移动到其他PC /目录也可以使用,您需要一些解决方案来动态地将程序包父目录添加到PYTHONPATH
。这是我对这种情况的解决方案(对于Linux,但如果你稍微调整一下,你也可以将简单的脚本翻译成Windows)。)
在您创建project
创建pwd_to_pythonpath.sh
的同一文件夹中,使用简短的bash脚本:
#!/bin/bash
export PYTHONPATH=$PYTHONPATH:`pwd`
然后为您的A和B创建启动器,例如A.sh
看起来像:
#!/bin/bash
source pwd_to_pythonpath.sh
python -m project.A.app_name
app_name
应与A
文件夹中的模块文件名相同(本例中为app_name.py
)