如何在python/distutils中依赖系统命令?
我想找一个优雅的方法来提醒使用我这个库的用户,他们需要一个特定的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
是现在流行的新东西。)