HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //proc/self/root/usr/share/dh-python/dhpython/__pycache__/interpreter.cpython-310.pyc
o

O�Ib�R�@s�ddlZddlZddlZddlmZmZmZddlmZm	Z	m
Z
e�dej�Z
e�dej�Ze�d�ZGdd�d�Zdd	lmZdd
lmZmZdS)�N)�exists�join�split)�INTERPRETER_DIR_TPLS�
PUBLIC_DIR_RE�
OLD_SITE_DIRSz�
    (?:\#!\s*){0,1}  # shebang prefix
    (?P<path>
        .*?/bin/.*?)?
    (?P<name>
        python|pypy)
    (?P<version>
        \d[\.\d]*)?
    (?P<debug>
        -dbg)?
    (?P<options>.*)
    an
    (?P<name>.*?)
    (?:\.
        (?P<stableabi>abi\d+)
     |(?:\.
        (?P<soabi>
            (?P<impl>cpython|pypy)
            -
            (?P<ver>\d{2,})
            (?P<flags>[a-z]*)
        )?
        (?:
            (?:(?<!\.)-)?  # minus sign only if soabi is defined
            (?P<multiarch>[^/]*?)
        )?
    ))?
    (?P<debug>_d)?
    \.so$�dhpythonc@s@eZdZdZdZdZdZdZdZdZ	iZ
		d?dd	�Zd
d�Zdd
�Z
dd�Zd@dd�ZdAdd�Zedd��Zedd��Zedd��Zedd��ZdBdd�ZdBdd�Zd d!�Zd"d#�ZdAd$d%�ZdAd&d'�ZdAd(d)�ZdAd*d+�ZdAd,d-�Z dAd.d/�Z!ed0d1��Z"ed2d3��Z#ed4d5��Z$dAd6d7�Z%d8d9�Z&dAd:d;�Z'dCd=d>�Z(dS)D�Interpretera�
    :attr path: /usr/bin/ in most cases
    :attr name: pypy or python (even for python3 and python-dbg) or empty string
    :attr version: interpreter's version
    :attr debug: -dbg version of the interpreter
    :attr impl: implementation (cpytho2, cpython3 or pypy)
    :attr options: options parsed from shebang
    :type path: str
    :type name: str
    :type version: Version or None
    :type debug: bool
    :type impl: str
    :type options: tuple
    z	/usr/bin/�pythonNF��cCs�t�}|d=|d=t|t�r#|��D]}	||	dur!t||	�||	<qn)|rL|�dd���r6|s6t|�|d<n|�|��	�D]\}	}
||	durK|
||	<q=|�	�D]\}	}
|
dur_t
||	|
�qP|	dkrit
||	|
�qPdS)N�self�value�.r�version)�locals�
isinstancer	�keys�getattr�replace�isdigit�Version�parse�items�setattr)r
r�path�namer�debug�impl�options�params�key�valrr�,/usr/share/dh-python/dhpython/interpreter.py�__init__Ss.
�����zInterpreter.__init__cCs�|dkr1|dvrtd|��|dkr'|jr&|jjdkr!d|jd<n0d|jd<n*|d	kr0d	|jd<n |d
krQ|durQt|�}|jsQ|jdkrQ|jdkrNd|_nd|_|dvr[|dur[dS|dkrht|�|j|<dS||j|<dS)
Nr)r
�pypyrzinterpreter not supported: %sr
��cpython3r�cpython2r%r)rrrrr)�
ValueErrorr�major�__dict__rrr�bool)r
rrrrr#�__setattr__ns.
�
�
zInterpreter.__setattr__cCsF|j}|�d�s|d7}||�|j�7}|jr!|dd�|j�7}|S)N�/� )r�endswith�_vstrrrr�r
�resultrrr#�__repr__�s
zInterpreter.__repr__cCs|�|j�S�N)r1r�r
rrr#�__str__�szInterpreter.__str__cCs`|jdkr|jS|p|jpd}|r!|r||jkr!|jdkrdnd}|jr)d�|�S|jt|�S)Nr%rr'�3�2zpython{}-dbg)rrr�default_versionr�format�str)r
r�consider_default_verrrr#r1�s

zInterpreter._vstrcCsd�|j|�|��S)N�{}{}�r;rr1�r
rrrr#�binary�szInterpreter.binarycCsd�|j|jdd��S)z�Like binary(), but returns path to default intepreter symlink
        if version matches default one for given implementation.
        r>T)r=r?r6rrr#�	binary_dv�szInterpreter.binary_dvcCs|jrt|j�SdSr5)r�defaultr6rrr#r:�s
�zInterpreter.default_versioncCsZt�|�}|s	iS|��}d|vrt|d���|d<|ddkr+|ddur+d|d<|S)a^Return dict with parsed shebang

        >>> sorted(Interpreter.parse('/usr/bin/python3.2-dbg').items())
        [('debug', '-dbg'), ('name', 'python'), ('options', ()), ('path', '/usr/bin/'), ('version', '3.2')]
        >>> 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')]
        rrr
rNr9)�
SHEBANG_RE�search�	groupdict�tupler)�shebangr3rrr#r�s
zInterpreter.parsecCs�t�}t|d��}|�d�}d|vrtd��Wd�n1s wYt|d��d�d}|�d	�s:td
|��|�|�}|sGtd
|��|��D]
\}}t	|||�qK|S)z!Read file's shebang and parse it.�rb�`�zcannot parse binary fileNzutf-8�
rz#!zdoesn't look like a shebang: %s)
r	�open�readr)r<r�
startswithrrr)�cls�fpath�interpreter�fp�data�parsedr!r"rrr#�	from_file�s 
��

zInterpreter.from_filec
Cs�z	t|p|j�}Wnty}ztd|��d}~ww|jdkr$d}n|td�>r/d|}n
|td�>r:d|}nd	}|rBd
|}|rJd||f}|S)a�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/'
        �cannot find valid version: %sNr%z/usr/lib/pypy/dist-packages/�2.6z /usr/lib/python%s/site-packages/z3.0z /usr/lib/python%s/dist-packages/z/usr/lib/python3/dist-packages/z/usr/lib/debug%szdebian/%s%s)rr�	Exceptionr)r)r
�packager�gdb�errrrrr#�sitedir�s$��


zInterpreter.sitedirc
s�z	t|p|j�}Wnty}ztd|��d}~wwg}t�|jg�D]}t|t�r5|�	|�
|��q%||�}|durB|�	|�q%|rZdd�|D�}|j�d�rZ|�	d�
|���re�fdd�|D�}|S)z5Return deprecated paths to site-packages directories.rWNcSsg|]}d�|��qS)z/usr/lib/debug{}�r;��.0�irrr#�
<listcomp>sz,Interpreter.old_sitedirs.<locals>.<listcomp>�cpythonz(/usr/lib/debug/usr/lib/pyshared/python{}csg|]}d��|��qS)zdebian/{}{}r^r_�rZrr#rbs)rrrYr)r�getrrr<�appendr;rO)r
rZrr[r\r3�item�resrrdr#�old_sitedirs�s*��

�zInterpreter.old_sitedirscCs:t|j�|�}|r|�d�}|r|drt|�SdSdS)z]Return version assigned to site-packages path
        or True is it's unversioned public dir.rTN)rr�match�groupsr)r
rrj�versrrr#�parse_public_dirs
�zInterpreter.parse_public_dircsld��j�}|�jjvr+�fdd�t��D�}t�d�dd�|D���}|�jj|<n�jj|}|�	|�S)zBReturn True if path is used by another interpreter implementation.zshould_ignore_{}csg|]\}}|�jkr|�qSr)r)r`�k�vr6rr#rb$sz-Interpreter.should_ignore.<locals>.<listcomp>�|css�|]}d�|�VqdS)z({})Nr^r_rrr#�	<genexpr>%s�z,Interpreter.should_ignore.<locals>.<genexpr>)
r;r�	__class__�_cacherr�re�compilerrE)r
r�	cache_key�expr�regexprr6r#�
should_ignore s
zInterpreter.should_ignorecCsvt|p|j�}d|jvrdnd}|td�kr||St|�\}}|�d�s)|d7}t|dd|dd	�|�|�|f�S)
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.8')          # doctest: +SKIP
        'bar/__pycache__/foo.cpython-38.pyc'
        z-O�o�c�3.1z.py�__pycache__z
%s.%s.py%sN���)rrrrr0r�	magic_tag)r
rQr�	last_char�fdir�fnamerrr#�
cache_file+s
�zInterpreter.cache_filecCs0t|p|j�}|jdkrdS|�d|�}t|�S)zReturn magic number.r(rz"import imp; print(imp.get_magic()))rrr�_execute�eval)r
rr3rrr#�magic_numberDs

zInterpreter.magic_numbercCs6t|p|j�}|j�d�r|td�>rdS|�d|�S)z�Return Python magic tag (used in __pycache__ dir to tag files).

        >>> i = Interpreter('python')
        >>> i.magic_tag(version='3.8')                 # doctest: +SKIP
        'cpython-38'
        rc�3.2rz import imp; print(imp.get_tag()))rrrrOr�r@rrr#rLszInterpreter.magic_tagcCsNt|p|j�}z|�|�dd�\}}W|Sty&tjddd�YdSw)zReturn multiarch tag.N�zcannot get multiarchT��exc_infor�rr�_get_configrY�logr�r
r�soabi�	multiarchrrr#r�Xs��zInterpreter.multiarchcCs8t|p|j�}|jdkr|td�?rd�|j�SdSdS)Nr'r�zabi{})rrrr;r*r@rrr#�	stableabics�zInterpreter.stableabicCsNt|p|j�}z|�|�dd�\}}W|Sty&tjddd�YdSw)z)Return SOABI flag (used to in .so files).Nr�zcannot get soabiTr�rr�r�rrr#r�is��zInterpreter.soabicCs�|jdkrdSz
|��d}|r|WSWnty&d}tjddd�Ynwd�|j�}|j}|jrM|d	kr=|d
7}|S|d>rG|d7}|S|d
7}|S|d	krT	|S|d?r^|d7}|S|dkrf|d7}|S)z�Return INCLUDE_DIR path.

        >>> Interpreter('python2.7').include_dir       # doctest: +SKIP
        '/usr/include/python2.7'
        >>> Interpreter('python3.8-dbg').include_dir   # doctest: +SKIP
        '/usr/include/python3.8d'
        r%z/usr/lib/pypy/includer�r�cannot get include pathTr��/usr/include/{}z3.8�d�3.3�_d�dmr��m�mu)rr�rYr�rr;rr)r
r3rrrr#�include_dirus>
	���
����zInterpreter.include_dircCs�|jdvs|js|jd?s|jd>rdSz|��d}|r,|�d�r)|dd�WSWdSW|StyEd�|j�}tjd	d
d�Y|Sw)z+Return path to symlinked include directory.)r(r%z3.7r�Nr�r����r�r�Tr�)	rrrr�r0rYr;rr�r2rrr#�symlinked_include_dir�s&��
�	��z!Interpreter.symlinked_include_dircCsX|jdkrdS|��dd�\}}|�d�r|�dd�}|r%|r%t||�Std�|���)zReturn libfoo.so file path.r%rr&�z.a�.sozcannot find library file for {})rr�r0rrrYr;)r
�libpl�	ldlibraryrrr#�library_file�s


zInterpreter.library_filec
Cs|s|jsdSt|p|j�}d|vr|�dd�\}}nd}t�|�}|s&dS|��}|drE|r5|jdurEtd|dd|ddf�}|drKdS|d	rV|jd
urVdS|dr`|dr`dSz
|�|�dd
�\}}Wnt	y~t
jddd�YdSw|dr�|r�|d|kr�dS|dp�|}|dp�|}|d}	|	�d�r�|	dkr�|jdkr�|d?s�|jdkr�|dkr�|	dd�}	|r�d�
|	|�}	|r�|jdkr�|d>s�||vr�d�
|	|�}	n|jdkr�|dkr�|r�d�
|	|�}	|jr�|jdkr�|	d7}	|	d7}	||	k�rdSt||	�S)z2Return extension file name if file can be renamed.Nr.�r�verz%s.%srr�rFr�r�r�zcannot get soabi/multiarchTr�r�moduler'r�r(z2.7i����z{}.{}r�z{}-{}r�r�)rr�rsplit�
EXTFILE_RErErF�minorrr�rYr�r0rr;r)
r
r�rr��infor�r��	tmp_soabi�
tmp_multiarchr3rrr#�
check_extname�s\

 ��

zInterpreter.check_extnamecCsP|�dd�}|jdkrd�|�S|jdkrdnd}d�||�}|jr&|d	7}|S)
aISuggest binary package name with for given library name

        >>> Interpreter('python3.1').suggest_pkg_name('foo')
        'python3-foo'
        >>> Interpreter('python3.8').suggest_pkg_name('foo_bar')
        'python3-foo-bar'
        >>> Interpreter('python2.7-dbg').suggest_pkg_name('bar')
        'python-bar-dbg'
        �_�-r%zpypy-{}r'r8rzpython{}-{}z-dbg)rrr;r)r
rrr3rrr#�suggest_pkg_name�s


zInterpreter.suggest_pkg_namecCs�t|p|j�}|jdks"|j�d�r%|d?r|d>s"|d?s"|dkr%d}nd}|d7}|�||��d	�}|d
|dvrJ|d�d|d
d
�|d<z
tjd|d
<W|St	y^Y|Sw)Nr%rcrXr8r|zimport sysconfig as s;z%from distutils import sysconfig as s;zrprint("__SEP__".join(i or "" for i in s.get_config_vars("SOABI", "MULTIARCH", "INCLUDEPY", "LIBPL", "LDLIBRARY")))�__SEP__r�rz-%sr�DEB_HOST_MULTIARCH)
rrrrOr�rr�os�environ�KeyError)r
r�cmd�	conf_varsrrr#r�s,�����zInterpreter._get_configTcCs�t|p|j�}d�|j|�|��}d�||�dd��}|r)||jjvr)|jj|St|�s3t	d|��t
|�}|ddkrNt�|d�t	d�||d���|d	�
�}t|�d
kr^|d}|rf||jj|<|S)Nr>z
{} -c '{}'�'z5cannot execute command due to missing interpreter: %s�
returncoder�stderrz{} failed with status code {}�stdoutr�)rrr;rr1rrrrsrrY�executer�r�
splitlines�len)r
�commandr�cache�exe�outputr3rrr#r�%s&�zInterpreter._execute)NNNNNNN)NFr5)NNF)NT))�__name__�
__module__�__qualname__�__doc__rrrrrrrsr$r-r4r7r1rA�propertyrBr:�staticmethodr�classmethodrVr]rirmryr�r�rr�r�r�r�r�r�r�r�r�r�rrrr#r	<sZ
�	







%







#


@
r	)r�)rrC)�loggingr�rt�os.pathrrrrrrrru�VERBOSErDr��	getLoggerr�r	�dhpython.toolsr��dhpython.versionrrCrrrr#�<module>s&��