
    9bh4                         S SK r S SKrS SKrS SKJrJr  S SKJr  S SKJ	r	  \R                  " S\R                  5      r\R                  " S\R                  5      r\ R                  " \5      r " S S5      rg)	    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                       \ rS rSrSrSrSrSrSrSr	0 r
  SS jrS rS	 rS
 rS r\S 5       rSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)Interpreter<   NpythonFcpython c                    [        5       nUS	 US	 [        U[        5      (       a,  UR                  5        H  n	X   b  M
  [	        X5      X'   M     OuU(       an  UR                  SS5      R                  5       (       a  U(       d  [        U5      US'   O3U R                  U5      R                  5        H  u  pX   b  M  XU	'   M     UR                  5        H  u  p[        X	U
5        M     g )Nselfvalue. 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                 r   US:X  ah  U(       aa  UR                  S5      (       a  SU R                  S'   O%UR                  S5      (       a  SU R                  S'   SU;   a  SU R                  S'   OUS	:X  a  Ub  [        U5      nUS
;   a!  Uc  [        [        U5      U R                  U'   g X R                  U'   g )Nr   r
   r   r   pypyz-dbgTr   r   )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                     U R                   =(       d    SnXR                  U R                  5      -  nU R                  (       a!  USSR	                  U R                  5      -   -  nU$ )Nr    )r   _vstrr   r    r   )r   results     r$   __repr__Interpreter.__repr__j   sL    b**T\\**<<cCHHT\\222Fr'   c                 8    U R                  U R                  5      $ N)r0   r   )r   s    r$   __str__Interpreter.__str__q   s    zz$,,''r'   c                    U R                   S:X  a  U R                  $ U(       aS  [        U5      U R                  ;  a:  U R                  (       a  SR	                  U5      $ U R                  [        U5      -   $ U R                  $ )Nr)   zpython{}-dbg)r   r   strr   formatr   r   s     r$   r0   Interpreter._vstrt   s_    9999s7|4994zz%,,W5599s7|++yyr'   c                     [         R                  U 5      nU(       d  0 $ UR                  5       nSU;   a  [        US   R	                  5       5      US'   U$ )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   )shebangr1   s     r$   r   Interpreter.parse~   sT      ""7+I!!# %fY&7&=&=&? @F9r'   c                    [        U=(       d    U R                  5      nU R                  S:X  a  SnO4U[        S5      -  (       a  SU-  nOU[        S5      -  (       a  SU-  nOSnU(       a  SU-  nU(       a	  S	U< U< 3nU$ )
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   sz    & '1T\\2 991D&5?D&5?D4D%,D$+T2Dr'   c           	      0   [        U=(       d    U R                  5      nSU R                  ;   a  SOSnU[        S5      ::  a  X-   $ [        U5      u  pEUR	                  S5      (       d  US-  n[        USUSS < S	U R                  U5      < SU< 35      $ )
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     '1T\\24<</CS	gen$$$El~~e$$UNED-3BZ!8)*E F 	Fr'   c                    [        U=(       d    U R                  5      nU R                  U5      u  p4UR                  SS5      S   nU(       a/  USR	                  U5      -  nU(       a  USR	                  U5      -  nU R
                  (       a(  U R                  S:X  a  U[        S5      -  (       a  US-  nS	R	                  U5      $ )
z5Return extension name with soname and multiarch tags.r      r   z.{}z-{}r   3_dz{}.so)r   r   _get_configr   r:   r   r   )r   r   r   soabi	multiarchr1   s         r$   ext_fileInterpreter.ext_file   s    '1T\\2++G4C#A&ell5))F%,,y11::$))y0ws|+dNF~~f%%r'   c                     [        U=(       d    U R                  5      nU R                  S:X  a  U[        S5      -  (       a  gU R                  SU5      n[	        U5      $ )zReturn magic number.r   rZ   r   z9import importlib.util; print(importlib.util.MAGIC_NUMBER))r   r   r   _executeeval)r   r   r1   s      r$   magic_numberInterpreter.magic_number   sK    '1T\\299	!g&=Z\cdF|r'   c                     [        U=(       d    U R                  5      nU R                  S:X  a  U[        S5      -  (       a  gU R                  SU5      $ )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   rb   r;   s     r$   rQ   Interpreter.magic_tag   sD     '1T\\299	!g&?}}NPWXXr'   c                     [        U=(       d    U R                  5      n U R                  U5      u  p#U$ ! [         a    [        R                  SSS9   gf = f)zReturn multiarch tag.zcannot get multiarchTexc_infor   r   r   r\   	Exceptionlogr   r   r   r]   r^   s       r$   r^   Interpreter.multiarch   sZ    '1T\\2	#//8E
 	  	II,tI<	   5 AAc                     [        U=(       d    U R                  5      nU R                  S:X  a/  U[        S5      -	  (       a  SR                  UR                  5      $ g g )Nr   rg   zabi{})r   r   r   r:   majorr;   s     r$   	stableabiInterpreter.stableabi  sH    '1T\\299	!g&?>>'--00 '@!r'   c                     [        U=(       d    U R                  5      n U R                  U5      u  p#U$ ! [         a    [        R                  SSS9   gf = f)z{Return SOABI flag (used to in .so files).

>>> i = Interpreter('python')
>>> i.soabi(version=Version('3.3'))
'cpython-33m'
zcannot get soabiTrj   r   rl   ro   s       r$   r]   Interpreter.soabi	  s[     '1T\\2	#//8E
 	  	II(4I8	rq   c                    [        U=(       d    U R                  5      nSU;   a  UR                  SS5      u  p1OSn[        R	                  U5      nU(       d  gUR                  5       nUS   (       a  g[        XS9nUS   (       a#  SR                  US   S	   US   S   5      Ul        UR                  (       d#  US
   (       d  SUS   =(       d    S;   a  SUl         UR                  5       u  pgUS   nUR                  S:X  a/  UR                  S-	  (       a  UR                  S5      (       a  USS nUS   (       d  U(       aK  SR                  XS   =(       d    U5      nUS   (       d  U(       a  SR                  XS   =(       d    U5      nUS-  nX:X  a  g[        X85      $ ! [         a    [        R                  SSS9   gf = f)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'
/rY   r   Nrt   )r   verz{}.{}r   r   dflagsTzcannot get soabi/multiarchrj   r   r   rg   moduleir]   r^   z{}-{}z.so)r   r   rsplit
EXTFILE_REr?   r@   r   r:   r   r\   rm   rn   r   rP   r   )	r   rU   r   rT   infoir]   r^   r1   s	            r$   check_extnameInterpreter.check_extname  s    '1T\\2%<,,sA.KD%D  '~~.;tE{1~tE{1~FAIwwDMST']5Hb-IAG	 }}E f66Y199#5&//(:S:SCR[F=E^^FM,BUCFK I [0A0NYO%?D!!  	II2TIB	s   F' 'GGc                 n   [        U=(       d    U R                  5      nU R                  S:X  d4  U R                  S:X  a'  US-	  (       a
  US-  (       d  US-	  (       d  US:X  a  SnOSnUS-  nU R                  X!5      R	                  S	5      n [
        R                  S
   US'   U$ ! [         a     U$ f = f)Nr)   r   rE   rZ   rM   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_MULTIARCHrY   )r   r   r   rb   r   osenvironKeyError)r   r   cmd	conf_varss       r$   r\   Interpreter._get_configK  s    '1T\\2 99$))y"85 W^e#w#~*C9C D 	DMM#/55i@		::&:;IaL   		s   B& &
B43B4c                    [        U=(       d    U R                  5      nU R                  U5      SU4nU(       a2  XR                  R                  ;   a  U R                  R                  U   $ [        U5      nUS   S:w  a5  [        R                  US   5        [        SR                  XS   5      5      eUS   R                  5       n[        U5      S:X  a  US   nU(       a  XPR                  R                  U'   U$ )Nz-c
returncoder   stderrz{} failed with status code {}stdoutrY   )r   r   r0   	__class___cacher   rn   r   rm   r:   
splitlineslen)r   commandr   cacheoutputr1   s         r$   rb   Interpreter._execute^  s    '1T\\2::g&g6W 5 55>>((11!,1$IIfX&';BB7S_L`abb!,,.v;!AYF-3NN!!'*r'   )NNNNNNN)FNNr5   )NT)__name__
__module____qualname____firstlineno__r   r   r   r   r   r    r   r%   r,   r2   r6   r0   staticmethodr   rH   rV   r_   rd   rQ   r^   rt   r]   r   r\   rb   __static_attributes__r   r'   r$   r   r   <   s    DDGEDGFAE04$*( (  0$LF2&
Y	1"/"b&r'   r   )loggingr   reos.pathr   r   	debpythonr   debpython.versionr   compileVERBOSEr>   r   	getLoggerr   rn   r   r   r'   r$   <module>r      sq   *  	 	   %ZZ  

 ZZ   jj!
" !u ur'   