如何将Python应用程序模块化

6
我有许多脚本使用共同的定义。我该如何将它们分割成多个文件?此外,在我的情况下,应用程序不能以任何方式安装;必须能够同时运行任意数量的版本,并且必须在没有超级用户权限的情况下工作。我想到的解决方案有:
  • 复制代码到每个脚本中。这样做很混乱,可能是最糟糕的方案。
  • 将所有脚本和公共代码放在单个目录中,并使用from . import来加载它们。这种方法的缺点是,我想把我的库放在其他目录而不是应用程序中。
  • 将公共代码放在自己的目录中,编写一个__init__.py导入所有子模块,最后使用from . import来加载它们。保持代码组织良好,但是维护__init__.py和限定名称需要一些额外的工作。
  • 将库目录添加到sys.pathimport中。我倾向于这种方法,但我不确定调整sys.path是否是好的做法。
  • 使用execfile加载。(在Python 3中使用exec)。结合前两种方法的优点:每个模块只需要一行代码,并且我可以使用专用的文件。另一方面,这回避了Python模块概念并污染了全局命名空间。
  • 编写并使用distutils安装模块。这将为所有Python脚本安装库,并需要超级用户权限,并影响其他应用程序,因此在我的情况下不适用。

哪种方法最好?

5个回答

8

将路径添加到sys.path中(通常使用site.addsitedir)是相当普遍的,不会特别受到反对。当然,您希望将共享的常用工作内容放在方便的模块中。

如果您使用的是Python 2.6+,则已经有一个用户级模块文件夹可供使用,无需添加到sys.path或PYTHONPATH中。在类Unix系统上,它位于~/.local/lib/python2.6/site-packages - 有关更多信息,请参见PEP 370


+1:只需设置PYTHONPATH环境变量。简单、整洁、便携、干净。适用于任何地方。 - S.Lott
@S.Lott:适用于任何具有 shell 环境的地方。此外,您需要一个启动脚本来运行它,这会使事情变得复杂。 - phihag
@phihag:实际上你不需要一个启动脚本。PYTHONPATH可以在你的.bashrc或Windows设置中设置。 - S.Lott

4
你可以将 PYTHONPATH 环境变量设置为你的库文件所在的目录。这将把该路径添加到库搜索路径中,然后你就可以使用正常的 import 命令来导入它们。

3
如果您有多个环境,这些环境具有各种依赖关系的组合,一个很好的解决方案是使用virtualenv创建沙盒式Python环境,每个环境都有自己安装的软件包集。每个环境将像系统范围的Python站点包设置一样运行,但不需要超级用户权限即可创建本地环境。
谷歌有大量信息,但这篇文章看起来是一个相当不错的起点。

1

手动将路径添加到sys.path的另一种选择是使用环境变量PYTHONPATH

此外,distutils允许您使用以下方式指定自定义安装目录

 python setup.py install --home=/my/dir 

然而,如果您需要同时运行具有相同模块名称的多个版本,则这两种方法可能都不实用。在这种情况下,最好修改sys.path


1

我已经在多个项目中使用了第三种方法(将目录添加到sys.path),我认为这是一种有效的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接