Как зависит от системной команды с python / distutils? - PullRequest
2 голосов
/ 12 августа 2010

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

Когда моя ставка ставит время для ошибки:

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

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

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

Ответы [ 2 ]

4 голосов
/ 12 августа 2010

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

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

python setup.py build python setup.py install

или просто

python setup.py install (в этом случае установка python.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, и установка зависимости между командой и вашим пакетом.

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

4 голосов
/ 12 августа 2010

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

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

...