如何使用python/distutils依赖系统命令?

2024-10-02 12:31:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种最优雅的方式来通知我的库的用户他们需要一个特定的unix命令来确保它能正常工作。。。在

我的lib何时会出错:

  • 安装?在
  • 当我的应用程序调用命令时?在
  • 在我的lib导入时?在
  • 两者都有?在

以及如何检测命令丢失(if not commands.getoutput("which CommandIDependsOn"): raise Exception("you need CommandIDependsOn"))。在

我需要建议。在


Tags: 用户命令you应用程序whichiflib方式
2条回答

我根本没有支票。说明您的库需要此命令,如果用户试图使用库中需要它的任何部分,则运行该命令的任何部分都将引发异常。即使只提供了一部分功能,仍然可以导入并使用库。在

(PS:commands已旧且已损坏,不应在新代码中使用。subprocess是热门的新事物。)

在我看来,最好的方法是在安装时检查用户是否有这个特定的*nix命令。在

如果要使用distutils分发包,要安装它,必须执行以下操作:

python setup.py build python setup.py install

或者干脆

python setup.py install (in that case python setup.py build is implicit)

要检查是否安装了*nix命令,可以在设置.py像这样:

from distutils.core import setup
from distutils.command.build import build as _build

class build(_build):

    description = "Custom Build Process"
    user_options= _build.user_options[:]
    # You can also define extra options like this : 
    #user_options.extend([('opt=', None, 'Name of optionnal option')])

    def initialize_options(self):   

        # Initialize here you're extra options... Not needed in your case
        #self.opt = None
        _build.initialize_options(self)

    def finalize_options(self):
        # Finalize your options, you can modify value
        if self.opt is None :
            self.opt = "default value"

        _build.finalize_options(self)

    def run(self):
        # Extra Check
        # Enter your code here to verify if the *nix command is present
        .................

        # Start "classic" Build command
        _build.run(self)

setup(
        ....
        # Don't forget to register your custom build command
        cmdclass         = {'build' : build},
        ....
     )

但是,如果用户在安装软件包后卸载了所需的命令,该怎么办?要解决这个问题,唯一“好”的解决方案是使用诸如deb或rpm之类的打包系统,并在命令和包之间设置依赖关系。在

希望这有帮助

相关问题 更多 >

    热门问题