如何在python/distutils中依赖系统命令?

3 投票
2 回答
678 浏览
提问于 2025-04-16 02:40

我想找一个优雅的方法来提醒使用我这个库的用户,他们需要一个特定的Unix命令,这样才能确保它正常工作...

那么,我的库在什么时候抛出错误比较合适呢:

  • 在安装的时候?
  • 当我的应用调用这个命令的时候?
  • 在导入我的库的时候?
  • 两者都可以吗?

还有,我应该怎么检测这个命令是否缺失呢(if not commands.getoutput("which CommandIDependsOn"): raise Exception("你需要 CommandIDependsOn"))。

我需要一些建议。

2 个回答

5

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

如果你使用 distutils 来分发你的软件包,安装时你需要执行以下命令:

python setup.py build
python setup.py install

或者你也可以简单地执行:

python setup.py install(在这种情况下,python setup.py build 是隐含的)

要检查这个 *nix 命令是否已经安装,你可以在你的 setup.py 文件中重写 build 方法,像这样:

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 这样的打包系统,并在命令和你的软件包之间建立依赖关系。

希望这对你有帮助。

4

我觉得根本不需要做任何检查。你可以在文档里说明你的库需要这个命令,如果用户尝试使用库中需要这个命令的部分,就会出现一个错误,由执行这个命令的地方来处理。即使只有一部分功能可用,用户仍然可以导入你的库并使用它。

(顺便说一下,commands 是个旧东西,已经坏掉了,不应该在新代码中使用。subprocess 是现在流行的新东西。)

撰写回答