Я ищу самый элегантный способ уведомить пользователей моей библиотеки о том, что им нужна определенная команда unix, чтобы убедиться, что она будет работать ...

Когда моей библиотеке лучше всего выдавать ошибку:

  • Установка ?
  • Когда мое приложение вызывает команду?
  • При импорте моей библиотеки?
  • обе?

А также как определить, что команда отсутствует (if not commands.getoutput("which CommandIDependsOn"): raise Exception("you need CommandIDependsOn")).

Мне нужны советы.

3
christophe31 12 Авг 2010 в 10:41

2 ответа

Лучший ответ

Я бы вообще не получил чека. Документируйте, что вашей библиотеке требуется эта команда, и если пользователь попытается использовать ту часть вашей библиотеки, которая в ней нуждается, то при выполнении команды будет вызвано исключение. По-прежнему должна быть возможность импортировать вашу библиотеку и использовать ее, даже если предлагается только часть функций.

(PS: commands старый и сломанный, и его не следует использовать в новом коде. subprocess - самая горячая новинка.)

4
habnabit 12 Авг 2010 в 09:00

IMO, лучший способ - проверить при установке, есть ли у пользователя эта конкретная команда * nix.

Если вы используете distutils для распространения своего пакета, для его установки вам необходимо сделать:

python setup.py построить python setup.py установить

Или просто

установка python setup.py (в этом случае сборка python setup.py неявная)

Чтобы проверить, установлена ли команда * nix, вы можете создать подкласс метода сборки в файле setup.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, и установить зависимость между командой и вашим пакетом.

Надеюсь это поможет

5
ohe 26 Мар 2012 в 15:24