web-dev-qa-db-ja.com

単一のコマンドラインで "update-alternatives --config gdm3.css"に優先順位番号を割り当てる方法は?

ターミナルでこれらのコマンドを実行できます:

$ Sudo update-alternatives --install /usr/share/gnome-Shell/theme/gdm3.css gdm3.css /usr/share/gnome-Shell/theme/mytheme/mytheme.css 10
$ Sudo update-alternatives --config gdm3.css
There are 2 choices for the alternative gdm3.css (providing /usr/share/gnome-Shell/theme/gdm3.css).

  Selection    Path                                                    Priority   Status
------------------------------------------------------------
* 0            /usr/share/gnome-Shell/theme/ubuntu.css                  10        auto mode
  1            /usr/share/gnome-Shell/theme/mytheme/mytheme.css         10        manual mode
  2            /usr/share/gnome-Shell/theme/ubuntu.css                  10        manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/share/gnome-Shell/theme/mytheme/mytheme.css to provide /usr/share/gnome-Shell/theme/gdm3.css (gdm3.css) in manual mode

これら2つのコマンドをpython3.6 subprocess.run()に配置します。

私が持っている問題は、2番目のコマンドです。 /usr/share/gnome-Shell/theme/mytheme/mytheme.cssと同じコマンドラインでgdm3.cssSudo update-alternatives --config gdm3.cssの代替として割り当てるにはどうすればよいですか?

また、このコマンドには、mytheme.cssを選択するための数値エントリが必要です。割り当てられた番号は、割り当てられた優先度に依存します。つまり、割り当てられた番号は非常に任意である可能性があります。割り当てられた番号の恣意的な性質を克服するにはどうすればよいですか?

2
Sun Bear

@PRATAPコメントに基づいて、私はこのpython3.6ソリューションを私の質問に開発しました。それは私のUbuntu 18.04システムで動作しました。私はそれが同じニーズを持つ他の人に利益をもたらすことを望んでいます.

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from subprocess import run, PIPE
from pathlib import Path
import mimetypes

class CSSFileTypeError(Exception):
    pass

class GDM3_alternatives:
    '''Class to query and configure gdm3.css.

    Argument:
      mytheme - path to my gnome-Shell theme .css file.

    Attributes:
      mytheme - path to my gnome-Shell theme .css file.
      query   - stdout from "update-alternatives --query gdm3.css" store in a list
      link    - gdm3.css path
      best    - gdm3.css alternative path selected by auto mode 
      value   - current gdm3.css alternative path 
      status  - whether gdm3.css is selected by manual or automatic mode 
      max     - maximum Priority value of all the installed gdm3.css alternatives

    Methods:
      exist()     - determines whether "mytheme" is installed as a gdm3.css alternative.
      configure() - configure "mytheme" file as a gdm3.css alternative.
    '''
    def __init__( self, mytheme=None ):       
        def _get( qvalue ):
            return [ line[ line.index('/') : ] for line in self.query if qvalue in line ][0]
        self.mytheme = mytheme
        self.query = run( [ 'update-alternatives', '--query', 'gdm3.css' ],
                          stdout=PIPE, encoding="utf-8" ).stdout.splitlines()
        self.link   = _get( 'Link:' )
        self.best   = _get( 'Best:' )
        self.value  = _get( 'Value:' )
        self.status = [ line[ line.index(':')+2 : ] for line in self.query if 'Status:' in line ][0]
        self.max = max( [ int( line[ line.index(':')+1 : ] ) for line in self.query if 'Priority:' in line ] )
        #print( f'self.query = {self.query}' )  #For debugging
        #print( f'self.link  = {self.link}' )   #For debugging
        #print( f'self.best  = {self.best}' )   #For debugging
        #print( f'self.value = {self.value}' )  #For debugging
        #print( f'self.status= {self.status}' ) #For debugging
        #print( f'self.max   = {self.max}' )    #For debugging

    def exist( self ):
        '''Method that determines whether "mytheme.css" is installed as a gdm3.css alternative. '''
        if self.mytheme == None:
            raise TypeError( '.css file was not defined.' ) 
        if not Path( self.mytheme ).exists():
            raise FileNotFoundError( f'{self.mytheme} does not exist.' )
        if 'css' not in mimetypes.guess_type( self.mytheme )[0] :
            raise CSSFileTypeError( f'{self.mytheme} is not a css file.' )
        return True in [ True for line in self.query if self.mytheme in line ]

    def configure( self ):
        '''Method to configure my theme ".css" file as a gdm3.css alternative.'''
        def _config():
            if 'auto' not in self.status:
                run( [ 'update-alternatives', '--auto', 'gdm3.css' ] ) #Ensure auto mode is used
            run( [ 'update-alternatives', '--install', self.link, 'gdm3.css', self.mytheme, str(self.max + 1) ] )
            print( f'Configured {self.mytheme} as gdm3.css alternative.' )

        if not self.exist():
            _config()
        Elif self.value in self.mytheme:
            print( f'{self.mytheme} is already gdm3.css alternative.' )
        else:
            run( [ 'update-alternatives', '--remove', 'gdm3.css', self.mytheme ] )
            self.__init__( self.mytheme )
            _config()

if __name__ == '__main__':
    #mytheme = '/usr/share/gnome-Shell/theme/mytheme/mytheme.css' 
    mytheme = '/usr/share/gnome-Shell/theme/mytheme/mytheme.css' #Change this to your theme
    gdm3 = GDM3_alternatives( mytheme )
    gdm3.configure()

## This script needs to be executed by Sudo. ## 

このスクリプトの使用方法:

  1. .py拡張子の付いたファイルに保存します。 myscript.py
  2. mytheme = '/usr/share/gnome-Shell/theme/mytheme/mytheme.css'を変更して、テーマの.cssパスを表示します。
  3. 端末でスクリプトを実行しますSudo権限あり、つまりSudo python3.6 myscript.pyと入力します。または、Sudo権限を使用してpython IDLEを開き、これをpythonスクリプトで実行します。

Ubuntu 18.04システムのupdate-alternativesのバージョンは次のとおりです。

$ update-alternatives --version
Debian update-alternatives version 1.19.0.5.

This is free software; see the GNU General Public License version 2 or
later for copying conditions. There is NO warranty.
1
Sun Bear