开发Python模块 - 将它们添加到Path

时间:2013-06-07 09:20:46

标签: python

我对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的东西但这感觉不对。

3 个答案:

答案 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

首先,为您创建的包创建根目录。我们称之为projectproject的子目录是您的应用,即AB。现在,您必须将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