o b4@sxddlZddlZddlZddlmZmZddlmZddlm Z e dej Z e dej Z eeZGdddZdS) N)joinsplit)execute)Versionz (?:\#!\s*){0,1} # shebang prefix (?P .*?/bin/.*?)? (?P python|pypy) (?P \d[\.\d]*)? (?P -dbg)? (?P.*) a- (?P.*?) (?:\. (?Pabi\d+) |(?:\. (?P (?Pcpython|pypy) - (?P\d{2}) (?P[a-z]*?) ) (?: -(?P[^/]*?) )? ))? (?P_d)? \.so$c@seZdZdZdZdZdZdZdZiZ  d)ddZ dd Z d d Z d d Z ddZeddZd*ddZd+ddZd+ddZd+ddZd+ddZd+ddZd+ddZd+d d!Zd+d"d#Zd+d$d%Zd,d'd(ZdS)- InterpreterNpythonFcpythonc Cst}|d=|d=t|tr#|D]} || dur!t|| || <qn)|rL|ddr6|s6t||d<n|| D]\} } || durK| || <q=| D] \} } t || | qPdS)Nselfvalue.version) locals isinstancerkeysgetattrreplaceisdigitrparseitemssetattr) r r pathnamerdebugimploptionsparamskeyvalr r +/usr/share/python3/debpython/interpreter.py__init__Es&    zInterpreter.__init__cCs|dkr%|r%|drd|jd<n |drd|jd<d|vr$d|jd<n |d kr1|dur1t|}|d vrC|durCtt||j|<dS||j|<dS) Nrrrrpypyz-dbgTrr)rrrr) startswith__dict__rrr)r rr r r r __setattr__Zs      zInterpreter.__setattr__cCs8|jpd}|||j7}|jr|dd|j7}|S)Nr  )r_vstrrrr)r resultr r r __repr__js zInterpreter.__repr__cCs ||jSN)r'r)r r r r __str__qs zInterpreter.__str__cCsF|jdkr|jS|r t||jvr |jrd|S|jt|S|jS)Nr"z python{}-dbg)rrstrrformatr rr r r r'ts  zInterpreter._vstrcCs:t|}|s iS|}d|vrt|d|d<|S)aReturn 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_REsearch groupdicttupler)shebangr(r r r r~s zInterpreter.parsecCsnt|p|j}|jdkrd}n|td>rd|}n |td>r%d|}nd}|r-d|}|r5d ||f}|S) aReturn 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/z3.0z /usr/lib/python%s/dist-packages/z/usr/lib/python3/dist-packages/z/usr/lib/debug%sz debian/%s%s)rrr)r gdbpackagerrr r r sitedirs      zInterpreter.sitedircCsvt|p|j}d|jvrdnd}|tdkr||St|\}}|ds)|d7}t|dd|dd |||fS) aGiven 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-Ooc3.1z.py __pycache__z %s.%s.py%sN)rrrrendswithr magic_tag)r fpathr last_charfdirfnamer r r cache_files   zInterpreter.cache_filecCs~t|p|j}||\}}|ddd}|r(|d|7}|r(|d|7}|jr:|jdkr:|td>r:|d7}d |S) z5Return extension name with soname and multiarch tags.r rz.{}z-{}r3_dz{}.so)rr _get_configrr-rr)r rrsoabi multiarchr(r r r ext_files  zInterpreter.ext_filecCs<t|p|j}|jdkr|td>rdS|d|}t|S)zReturn magic number.rrEr z"import imp; print(imp.get_magic()))rrr_executeeval)r rr(r r r magic_numbers  zInterpreter.magic_numbercCs4t|p|j}|jdkr|td>rdS|d|S)zReturn Python magic tag (used in __pycache__ dir to tag files). >>> i = Interpreter('python') >>> i.magic_tag(version='3.2') 'cpython-32' r3.2r z import imp; print(imp.get_tag()))rrrrKr.r r r r>s zInterpreter.magic_tagcCsFt|p|j}z ||\}}W|Sty"tjdddYdSw)zReturn multiarch tag.zcannot get multiarchTexc_infor rrrG Exceptionlogrr rrHrIr r r rIs zInterpreter.multiarchcCs8t|p|j}|jdkr|td?rd|jSdSdS)NrrNzabi{})rrrr-majorr.r r r stableabis zInterpreter.stableabicCsFt|p|j}z ||\}}W|Sty"tjdddYdSw)zReturn SOABI flag (used to in .so files). >>> i = Interpreter('python') >>> i.soabi(version=Version('3.3')) 'cpython-33m' zcannot get soabiTrOr rQrTr r r rH s zInterpreter.soabic Cslt|p|j}d|vr|dd\}}nd}t|}|sdS|}|dr)dSt||d}|drBd|dd |dd|_|jsT|d sQd |d pOdvrTd |_z| \}}Wnt ymt jdd dYdSw|d}|j dkr|jd?r| dr|dd}|ds|rd||dp|}|ds|rd||dp|}|d7}||krdSt||S)aReturn 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' /rDr NrV)rverz{}.{}rrdflagsTzcannot get soabi/multiarchrOrrrNmoduleirHrIz{}-{}z.so)rrrsplit EXTFILE_REr0r1rr-rrGrRrSrr=r) r rBrrAinfoirHrIr(r r r check_extnames@        zInterpreter.check_extnamecCst|p|j}|jdks!|jdkr$|d?r|d>s!|d?s!|dkr$d}nd}|d7}|||d }z tjd |d <W|StyGY|Sw) Nr"rr4rEr:zimport 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_MULTIARCHrD)rrrrKrosenvironKeyError)r rcmd conf_varsr r r rGKs( zInterpreter._get_configTcCst|p|j}d|||dd}|r"||jjvr"|jj|St|}|ddkr=t |dt d||d|d }t |dkrM|d}|rU||jj|<|S) Nz {} -c '{}'' returncoderstderrz{} failed with status code {}stdoutrD) rrr-r'r __class___cacherrSrrR splitlineslen)r commandrcacheoutputr(r r r rK^s     zInterpreter._execute)NNNNNNN)FNNr*)NT)__name__ __module__ __qualname__rrrrrrrmr!r%r)r+r' staticmethodrr7rCrJrMr>rIrVrHr`rGrKr r r r r<s8    &      1r)loggingrcreos.pathrr debpythonrdebpython.versionrcompileVERBOSEr/r] getLoggerrsrSrr r r r s