+
     ii4                         ^ RI t ^ RIt^ RIt^ RIHtHt ^ RIHt ^ RIH	t	 ]P                  ! R]P                  4      t]P                  ! R]P                  4      t] P                  ! ]4      t ! R R4      tR# )	    N)joinsplit)execute)Versionz
    (?:\#!\s*){0,1}  # shebang prefix
    (?P<path>
        .*?/bin/.*?)?
    (?P<name>
        python|pypy)
    (?P<version>
        \d[\.\d]*)?
    (?P<debug>
        -dbg)?
    (?P<options>.*)
    a-  
    (?P<name>.*?)
    (?:\.
        (?P<stableabi>abi\d+)
     |(?:\.
        (?P<soabi>
            (?P<impl>cpython|pypy)
            -
            (?P<ver>\d{2})
            (?P<flags>[a-z]*?)
        )
        (?:
            -(?P<multiarch>[^/]*?)
        )?
    ))?
    (?P<debug>_d)?
    \.so$c                      a  ] tR t^<t o RtRtRtRtRtRt	/ t
RR ltR tR tR tR	 t]R
 4       tRR ltRR ltRR ltRR ltRR ltRR ltRR ltRR ltRR ltRR ltRR ltRtV tR# )InterpreterNpythonFcpythonc                   \        4       pVR  VR \        V\        4      '       d2   VP                  4        F  p	W,          e   K  \	        W4      W&   K  	  M}V'       dv   VP                  RR4      P                  4       '       d   V'       g   \        V4      VR&   M8V P                  V4      P                  4        F  w  rW,          e   K  WV	&   K  	  VP                  4        F  w  r\        W	V
4       K  	  R# )selfvalueN. version)locals
isinstancer   keysgetattrreplaceisdigitr   parseitemssetattr)r   r   pathnamer   debugimploptionsparamskeyvals   &&&&&&&&   +/usr/share/python3/debpython/interpreter.py__init__Interpreter.__init__E   s    6N7Oe[)){{};&")%"5FK % }}S"%--//$+ENy! $

5 1 7 7 9HC{*&)s !: HCDs# '    c                   VR 8X  dm   V'       de   VP                  R4      '       d   RV P                  R&   M&VP                  R4      '       d   RV P                  R&   RV9   d   RV P                  R&   MVR8X  d   Ve   \        V4      pVR
9   d$   Vf    \        \        V4      V P                  V&   R	# W P                  V&   R	# )r   r	   r
   r   pypyz-dbgTr   r   N)r   r   r   r   )
startswith__dict__r   r   r   )r   r   r   s   &&&r"   __setattr__Interpreter.__setattr__Z   s    6>e))(1f%!!&))(.f%)-g&Y5#4ENE77EM")+t"<DMM$"'MM$r%   c                    V P                   ;'       g    R pWP                  V P                  4      ,          pV P                  '       d*   VRRP	                  V P                  4      ,           ,          pV# )r    )r   _vstrr   r   r   )r   results   & r"   __repr__Interpreter.__repr__j   sP    b**T\\**<<<cCHHT\\222Fr%   c                8    V P                  V P                  4      # N)r.   r   )r   s   &r"   __str__Interpreter.__str__q   s    zz$,,''r%   c                   V P                   R 8X  d   V P                  # V'       dZ   \        V4      V P                  9  d@   V P                  '       d   RP	                  V4      # V P                  \        V4      ,           # V P                  # )r'   zpython{}-dbg)r   r   strr   formatr   r   s   &&r"   r.   Interpreter._vstrt   sa    9999s7|4994zzz%,,W5599s7|++yyr%   c                    \         P                  V 4      pV'       g   / # VP                  4       pRV9   d$   \        VR,          P	                  4       4      VR&   V# )aS  Return dict with parsed shebang

>>> sorted(Interpreter.parse('pypy').items())
[('debug', None), ('name', 'pypy'), ('options', ()), ('path', None), ('version', None)]
>>> sorted(Interpreter.parse('/usr/bin/python3.3-dbg').items())
[('debug', '-dbg'), ('name', 'python'), ('options', ()), ('path', '/usr/bin/'), ('version', '3.3')]
>>> sorted(Interpreter.parse('#! /usr/bin/pypy --foo').items())
[('debug', None), ('name', 'pypy'), ('options', ('--foo',)), ('path', '/usr/bin/'), ('version', None)]
>>> sorted(Interpreter.parse('#! /usr/bin/python3.2').items())
[('debug', None), ('name', 'python'), ('options', ()), ('path', '/usr/bin/'), ('version', '3.2')]
>>> sorted(Interpreter.parse('/usr/bin/python3.2-dbg --foo --bar').items())
[('debug', '-dbg'), ('name', 'python'), ('options', ('--foo', '--bar')), ('path', '/usr/bin/'), ('version', '3.2')]
r   )
SHEBANG_REsearch	groupdicttupler   )shebangr/   s   & r"   r   Interpreter.parse~   sT      ""7+I!!# %fY&7&=&=&? @F9r%   c                <   \        T;'       g    V P                  4      pV P                  R8X  d   RpMFV\        R4      ,          '       d   RV,          pM$V\        R4      ,          '       d   RV,          pMRpV'       d
   RV,          pV'       d
   R	V: V: 2pV# )
ag  Return path to site-packages directory.

Note that returned path is not the final location of .py files

>>> i = Interpreter('python')
>>> i.sitedir(version='3.1')
'/usr/lib/python3/dist-packages/'
>>> i.sitedir(version='2.5')
'/usr/lib/python2.5/site-packages/'
>>> i.sitedir(version=Version('2.7'))
'/usr/lib/python2.7/dist-packages/'
>>> i.sitedir(version='3.1', gdb=True, package='python3-foo')
'debian/python3-foo/usr/lib/debug/usr/lib/python3/dist-packages/'
>>> i.sitedir(version=Version('3.2'))
'/usr/lib/python3/dist-packages/'
>>> Interpreter('pypy').sitedir(version='2.0')
'/usr/lib/pypy/dist-packages/'
r'   z/usr/lib/pypy/dist-packages/2.6z /usr/lib/python%s/site-packages/z3.0z /usr/lib/python%s/dist-packages/z/usr/lib/python3/dist-packages/z/usr/lib/debug%szdebian/)r   r   r   )r   gdbpackager   r   s   &&&& r"   sitedirInterpreter.sitedir   s    & '11T\\2 991D&&5?D&&5?D4D%,D7$+T2Dr%   c           	     H   \        T;'       g    V P                  4      pRV P                  9   d   RMRpV\        R4      8:  d	   W,           # \        V4      w  rEVP	                  R4      '       g
   VR,          p\        VRVRR	 : RV P                  V4      : RV: 24      # )
a^  Given path to a .py file, return path to its .pyc/.pyo file.

This function is inspired by Python 3.2's imp.cache_from_source.

:param fpath: path to file name
:param version: Python version

>>> i = Interpreter('python')
>>> i.cache_file('foo.py', Version('3.1'))
'foo.pyc'
>>> i.cache_file('bar/foo.py', '3.2')
'bar/__pycache__/foo.cpython-32.pyc'
z-Ooc3.1z.py__pycache__Nr   )r   r   r   r   endswithr   	magic_tag)r   fpathr   	last_charfdirfnames   &&&   r"   
cache_fileInterpreter.cache_file   s     '11T\\24<</CS	gen$$$El~~e$$UNED-3BZ!8)*E F 	Fr%   c                   \        T;'       g    V P                  4      pV P                  V4      w  r4VP                  R^4      ^ ,          pV'       d9   VRP	                  V4      ,          pV'       d   VRP	                  V4      ,          pV P
                  '       d3   V P                  R8X  d"   V\        R4      ,          '       d
   VR,          pRP	                  V4      # )z5Return extension name with soname and multiarch tags.r   z.{}z-{}r
   3_dz{}.so)r   r   _get_configr   r8   r   r   )r   r   r   soabi	multiarchr/   s   &&&   r"   ext_fileInterpreter.ext_file   s    '11T\\2++G4C#A&ell5))F%,,y11:::$))y0ws|++dNF~~f%%r%   c                    \        T;'       g    V P                  4      pV P                  R8X  d   V\        R4      ,          '       d   R# V P                  RV4      p\	        V4      # )zReturn magic number.r
   rW   r   z9import importlib.util; print(importlib.util.MAGIC_NUMBER))r   r   r   _executeeval)r   r   r/   s   && r"   magic_numberInterpreter.magic_number   sQ    '11T\\299	!g&=&=Z\cdF|r%   c                    \        T;'       g    V P                  4      pV P                  R8X  d   V\        R4      ,          '       d   R# V P                  RV4      # )zReturn Python magic tag (used in __pycache__ dir to tag files).

>>> i = Interpreter('python')
>>> i.magic_tag(version='3.2')
'cpython-32'
r
   3.2r   z/import sys; print(sys.implementation.cache_tag))r   r   r   r_   r9   s   &&r"   rO   Interpreter.magic_tag   sJ     '11T\\299	!g&?&?}}NPWXXr%   c                    \        T;'       g    V P                  4      p V P                  V4      w  r#V#   \         d    \        P                  RRR7        R# i ; i)zReturn multiarch tag.zcannot get multiarchTexc_infor   r   r   rY   	Exceptionlogr   r   r   rZ   r[   s   &&  r"   r[   Interpreter.multiarch   s]    '11T\\2	#//8E
 	  	II,tI<	   6 "AAc                    \        T;'       g    V P                  4      pV P                  R 8X  d6   V\        R4      ,	          '       d   RP                  VP                  4      # R# R# )r
   rd   zabi{}N)r   r   r   r8   majorr9   s   &&r"   	stableabiInterpreter.stableabi  sN    '11T\\299	!g&?&?>>'--00 '@!r%   c                    \        T;'       g    V P                  4      p V P                  V4      w  r#V#   \         d    \        P                  RRR7        R# i ; i)z{Return SOABI flag (used to in .so files).

>>> i = Interpreter('python')
>>> i.soabi(version=Version('3.3'))
'cpython-33m'
zcannot get soabiTrg   r   ri   rl   s   &&  r"   rZ   Interpreter.soabi	  s^     '11T\\2	#//8E
 	  	II(4I8	rn   c                J   \        T;'       g    V P                  4      pRV9   d   VP                  R^4      w  r1MRp\        P	                  V4      pV'       g   R# VP                  4       pVR,          '       d   R# \        WR7      pVR,          '       d4   RP                  VR,          ^ ,          VR,          ^,          4      Vn        VP                  '       g/   VR,          '       g   R	VR
,          ;'       g    R9   d   RVn         VP                  4       w  rgTR,          pTP                  R8X  d6   TP                  R,	          '       d   TP                  R4      '       d   TRR pTR,          '       g	   T'       d\   RP                  YR,          ;'       g    T4      pTR,          '       g	   T'       d#   RP                  YR,          ;'       g    T4      pTR,          pY8X  d   R# \        Y84      #   \         d    \        P                  RRR7        R# i ; i)aP  Return extension file name if file can be renamed.

>>> i = Interpreter('python')
>>> i.check_extname('foo.so', version='3.3') # doctest: +ELLIPSIS
'foo.cpython-33m-....so'
>>> i.check_extname('foo.abi3.so', version='3.3')
>>> i.check_extname('foo/bar/bazmodule.so', version='3.3') # doctest: +ELLIPSIS
'foo/bar/baz.cpython-33m-....so'
/r   Nrq   )r   verz{}.{}r   dflagsTzcannot get soabi/multiarchrg   r   r
   rd   modulerZ   r[   z{}-{}z.soi)r   r   rsplit
EXTFILE_REr=   r>   r   r8   r   rY   rj   rk   r   rN   r   )	r   rS   r   rR   infoirZ   r[   r/   s	   &&&      r"   check_extnameInterpreter.check_extname  s    '11T\\2%<,,sA.KD%D  '~~.;;tE{1~tE{1~FAIwwwDMMST']5H5Hb-IAG	 }}E f66Y199#5#5&//(:S:SCR[F==E^^FM,B,BUCFK  I [0A0N0NYO%?D!!  	II2TIB	s   G< <"H"!H"c                   \        T;'       g    V P                  4      pV P                  R 8X  gF   V P                  R8X  d8   VR,	          '       d   VR,          '       g   VR,	          '       g   VR8X  d   RpMRpVR,          pV P                  W!4      P	                  R4      p \
        P                  R	,          V^&   V#   \         d     T# i ; i)
r'   r
   rC   rW   rK   zimport sysconfig as s;z%from distutils import sysconfig as s;zOprint("__SEP__".join(i or "" for i in s.get_config_vars("SOABI", "MULTIARCH")))__SEP__DEB_HOST_MULTIARCH)r   r   r   r_   r   osenvironKeyError)r   r   cmd	conf_varss   &&  r"   rY   Interpreter._get_configK  s    '11T\\2 99$))y"85  W^^e##w#~*C9C D 	DMM#/55i@		::&:;IaL   		s   %C CCc                6   \        T;'       g    V P                  4      pV P                  V4      R V3pV'       d8   WP                  P                  9   d   V P                  P                  V,          # \        V4      pVR,          ^ 8w  d>   \        P                  VR,          4       \        RP                  WR,          4      4      hVR,          P                  4       p\        V4      ^8X  d
   V^ ,          pV'       d   WPP                  P                  V&   V# )z-c
returncodestderrz{} failed with status code {}stdout)r   r   r.   	__class___cacher   rk   r   rj   r8   
splitlineslen)r   commandr   cacheoutputr/   s   &&&&  r"   r_   Interpreter._execute^  s    '11T\\2::g&g6W 5 55>>((11!,1$IIfX&';BB7S_L`abb!,,.v;!AYF-3NN!!'*r%    )NNNNNNN)FNNr3   )NT)__name__
__module____qualname____firstlineno__r   r   r   r   r   r   r   r#   r*   r0   r4   r.   staticmethodr   rF   rT   r\   ra   rO   r[   rq   rZ   r   rY   r_   __static_attributes____classdictcell__)__classdict__s   @r"   r   r   <   s     DDGEDGF$*( (  0$LF2&
Y	1"/"b& r%   r   )loggingr   reos.pathr   r   	debpythonr   debpython.versionr   compileVERBOSEr<   r|   	getLoggerr   rk   r   r   r%   r"   <module>r      sq   *  	 	   %ZZ  

 ZZ   jj!
" !u ur%   