HEX
Server: Apache/2.4.65 (Debian)
System: Linux kubikelcreative 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64
User: www-data (33)
PHP: 8.4.13
Disabled: NONE
Upload Files
File: //usr/share/dh-python/dhpython/__pycache__/interpreter.cpython-39.pyc
a

��:`�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>.*)
    am
    (?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�ZdCdd�Zd d!�Zd"d#�ZdDd$d%�ZdEd&d'�ZdFd(d)�ZdGd*d+�ZdHd,d-�Z dId.d/�Z!ed0d1��Z"ed2d3��Z#ed4d5��Z$dJd6d7�Z%d8d9�Z&dKd:d;�Z'dLd=d>�Z(dS)M�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�rF|��D]}	||	dur$t||	�||	<q$nR|r�|�dd���rl|slt|�|d<n,|�|��	�D]\}	}
||	durz|
||	<qz|�	�D]2\}	}
|
dur�t
||	|
�q�|	dkr�t
||	|
�q�dS)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�|dkrb|dvrtd|��|dkrN|jr`|jjdkrBd|jd<q`d|jd<q�|d	kr�d	|jd<n@|d
kr�|dur�t|�}|js�|jdkr�|jdkr�d|_nd|_|dvr�|dur�n"|dkr�t|�|j|<n
||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}|jrB|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__�szInterpreter.__str__cCs`|jdkr|jS|p|jpd}|rB|r0||jkrB|jdkr>dnd}|jrRd�|�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:�szInterpreter.default_versioncCsZt�|�}|siS|��}d|vr6t|d���|d<|ddkrV|ddurVd|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)Zshebangr3rrr#r�s
zInterpreter.parsecCs�t�}t|d��*}|�d�}d|vr,td��Wd�n1s@0Yt|d��d�d}|�d	�sttd
|��|�|�}|s�td
|��|��D]\}}t	|||�q�|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�fpathZinterpreter�fp�dataZparsedr!r"rrr#�	from_file�s
&

zInterpreter.from_filec
Cs�zt|p|j�}Wn0tyB}ztd|��WYd}~n
d}~00|jdkrTd}n0|td�>rjd|}n|td�>r�d|}nd	}|r�d
|}|r�d||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�zt|p|j�}Wn0tyB}ztd|��WYd}~n
d}~00g}t�|jg�D]:}t|t�rv|�	|�
|��qV||�}|durV|�	|�qV|r�dd�|D�}|j�d�r�|�	d�
|���rևfdd�|D�}|S)z5Return deprecated paths to site-packages directories.rTNcSsg|]}d�|��qS)z/usr/lib/debug{}�r;��.0�irrr#�
<listcomp>�z,Interpreter.old_sitedirs.<locals>.<listcomp>�cpythonz(/usr/lib/debug/usr/lib/pyshared/python{}csg|]}d��|��qS)zdebian/{}{}r[r\�rWrr#r_r`)rrrVr)r�getrrr<�appendr;rN)r
rWrrXrYr3�item�resrrbr#�old_sitedirs�s$"
zInterpreter.old_sitedirscCs:t|j�|�}|r6|�d�}|r2|dr2t|�SdSdS)z]Return version assigned to site-packages path
        or True is it's unversioned public dir.rTN)rr�match�groupsr)r
rrhZversrrr#�parse_public_dirs
zInterpreter.parse_public_dircsld��j�}|�jjvrV�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#r_$r`z-Interpreter.should_ignore.<locals>.<listcomp>�|css|]}d�|�VqdS)z({})Nr[r\rrr#�	<genexpr>%r`z,Interpreter.should_ignore.<locals>.<genexpr>)
r;r�	__class__�_cacherr�re�compilerrE)r
rZ	cache_key�exprZregexprr6r#�
should_ignore szInterpreter.should_ignorecCsvt|p
|j�}d|jvrdnd}|td�kr4||St|�\}}|�d�sR|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
rPrZ	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�>r*dS|�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'
        ra�3.2rz import imp; print(imp.get_tag()))rrrrNr~r@rrr#rzLszInterpreter.magic_tagcCsPt|p
|j�}z|�|�dd�\}}Wn"tyJtjddd�YdS0|S)zReturn multiarch tag.N�zcannot get multiarchT��exc_infor�rr�_get_configrV�logr�r
r�soabi�	multiarchrrr#r�XszInterpreter.multiarchcCs4t|p
|j�}|jdkr0|td�?r0d�|j�SdS)Nr'r�zabi{})rrrr;r*r@rrr#�	stableabicszInterpreter.stableabicCsPt|p
|j�}z|�|�dd�\}}Wn"tyJtjddd�YdS0|S)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&|WSWn$tyLd}tjddd�Yn0d�|j�}|j}|jr�|d	krx|d
7}q�|d>r�|d7}q�|d
7}n,|d	kr�n"|d?r�|d7}n|dkr�|d7}|S)z�Return INCLUDE_DIR path.

        >>> Interpreter('python2.7').include_dir
        '/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�_dZdmr��mZmu)rr�rVr�rr;rr)r
r3rrrr#�include_dirus0	





zInterpreter.include_dircCs�|jdvs$|js$|jd?s$|jd>r(dSz2|��d}|rX|�d�rR|dd�WSWdSWn,ty�d�|j�}tjd	d
d�Yn0|S)z+Return path to symlinked include directory.)r(r%z3.7r�Nr�r����r�r�Tr�)	rrrr�r0rVr;rr�r2rrr#�symlinked_include_dir�s ��

z!Interpreter.symlinked_include_dircCs\|jdkrdS|��dd�\}}|�d�r8|�dd�}|rJ|rJt||�Std�|���dS)	zReturn libfoo.so file path.r%rr&�z.a�.sozcannot find library file for {}N)rr�r0rrrVr;)r
ZlibplZ	ldlibraryrrr#�library_file�s


zInterpreter.library_filec
Cs>|s|jsdSt|p|j�}d|vr6|�dd�\}}nd}t�|�}|sLdS|��}|dr�|rj|jdur�td|dd|ddf�}|dr�dS|d	r�|jd
ur�dS|dr�|dr�dSz|�|�dd
�\}}Wn$t	�y�t
jddd�YdS0|d�r"|�r"|d|k�r"dS|d�p.|}|d�p<|}|d}	|	�d��r�|	dk�r�|jdk�rr|d?�s�|jdk�r�|dk�r�|	dd�}	|�r�d�
|	|�}	|�r|jdk�r�|d>�s||v�rd�
|	|�}	n(|jdk�r|dk�r|�rd�
|	|�}	|j�r|jdk�r|	d7}	|	d7}	||	k�r4dSt||	�S)z2Return extension file name if file can be renamed.Nr.�rZverz%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�rVr�r0rr;r)
r
r|rr{�infor�r�Z	tmp_soabiZ
tmp_multiarchr3rrr#�
check_extname�sd

 ����&
zInterpreter.check_extnamecCsP|�dd�}|jdkr d�|�S|jdkr.dnd}d�||�}|jrL|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�}|jdksD|j�d�rJ|d?r4|d>sD|d?sD|dkrJd}nd}|d7}|�||��d	�}|d
|dvr�|d�d|d
d
�|d<ztjd|d
<Wnt	y�Yn0|S)Nr%rarUr8rwzimport 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")))Z__SEP__r�rz-%srZDEB_HOST_MULTIARCH)
rrrrNr~rr�os�environ�KeyError)r
r�cmdZ	conf_varsrrr#r�s*����zInterpreter._get_configTcCs�t|p
|j�}d�|j|�|��}d�||�dd��}|rR||jjvrR|jj|St|�sft	d|��t
|�}|ddkr�t�|d�t	d�||d���|d	�
�}t|�d
kr�|d}|r�||jj|<|S)Nr>z
{} -c '{}'�'z5cannot execute command due to missing interpreter: %s�
returncoder�stderrz{} failed with status code {}�stdoutr�)rrr;rr1rrorprrV�executer�r�
splitlines�len)r
Zcommandr�cacheZexe�outputr3rrr#r~%s&�zInterpreter._execute)NNNNNNN)NF)N)NNF)NNF)N)N)N)N)N)N)N)N)NT))�__name__�
__module__�__qualname__�__doc__rrrrrrrpr$r-r4r7r1rA�propertyrBr:�staticmethodr�classmethodrSrZrgrjrtr}r�rzr�r�r�r�r�r�r�r�r�r~rrrr#r	<sX�
	






%








#


@
r	)r�)rrC)Zloggingr�rq�os.pathrrrrrrrrr�VERBOSErDr�Z	getLoggerr�r	Zdhpython.toolsr�Zdhpython.versionrrCrrrr#�<module>s$��