Ye4ddlZddlZddlZddlmZmZddlmZddlm Z ej dej Z ej dej Z ejeZGddZdS) 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$ceZdZdZdZdZdZdZdZiZ ddZ dZ dZ d Z d Zed Zdd Zdd ZddZddZddZddZddZddZddZddZddZdS) InterpreterNpythonFcpythonct}|d=|d=t|tr3|D]} || t || || <ny|rw|ddr|st||d<n:|| D]\} } || | || <| D]\} } t|| | dS)Nselfvalue.version) locals isinstancerkeysgetattrreplaceisdigitrparseitemssetattr) r rpathnamerdebugimploptionsparamskeyvals +/usr/share/python3/debpython/interpreter.py__init__zInterpreter.__init__Es$ 6N 7O e[ ) ) *{{}} 6 6#;&")%"5"5F3K 6 *}}S"%%--// * *$+ENNy!! $ 5 1 1 7 7 9 9**HCc{*&)s   $ $HC D#s # # # # $ $c>|dkrP|rN|dr d|jd<n|dr d|jd<d|vr d|jd<n|d kr|t|}|d vr!|tt||j|<dS||j|<dS) Nrr r rpypyz-dbgTrr)rrrr) startswith__dict__rrr)r rrs r# __setattr__zInterpreter.__setattr__Zs 6>>e>)) /(1 f%%!!&)) /(. f%)- g& Y  5#4ENNE 7 7 7EM")+t"<">> 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.s r#rzInterpreter.parse~sh ""7++ I!!##    %fY&7&=&=&?&? @ @F9  r%ct|p|j}|jdkrd}n2|tdzrd|z}n|tdzrd|z}nd}|rd|z}|rd ||}|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%szdebian/)rrr)r gdbpackagerrs r#sitedirzInterpreter.sitedirs&'1T\22 9  1DD  & 55?DD  & 55?DD4D  -%,D  3 3$+GTT2D r%c 8t|p|j}d|jvrdnd}|tdkr||zSt|\}}|ds|dz }t |d|ddd ||d|S) 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__Nr)rrrrendswithr magic_tag)r fpathr last_charfdirfnames r# cache_filezInterpreter.cache_files'1T\224<//CCS genn $ $9$ $Ell e~~e$$  UNED-3B3ZZZ!8!8!8!8))*EFF Fr%czt|p|j}||\}}|ddd}|r2|d|z }|r|d|z }|jr"|jdkr|tdzr|dz }d |S) z5Return extension name with soname and multiarch tags.rrz.{}z-{}r 3_dz{}.so)rr _get_configrr5rr)r rrsoabi multiarchr.s r#ext_filezInterpreter.ext_files'1T\22++G44yC##A&  2 ell5)) )F 2%,,y111 : $)y00ws||+1 dNF~~f%%%r%ct|p|j}|jdkr|tdzrdS|d|}t |S)zReturn magic number.r rQrz9import importlib.util; print(importlib.util.MAGIC_NUMBER))rrr_executeeval)r rr.s r# magic_numberzInterpreter.magic_numbersY'1T\22 9 ! !g&= !2Z\cddF||r%ct|p|j}|jdkr|tdzrdS|d|S)zReturn Python magic tag (used in __pycache__ dir to tag files). >>> i = Interpreter('python') >>> i.magic_tag(version='3.2') 'cpython-32' r 3.2rz/import sys; print(sys.implementation.cache_tag))rrrrXr6s r#rIzInterpreter.magic_tagsP'1T\22 9 ! !g&? !2}}NPWXXXr%ct|p|j} ||\}}n-#t$r tddYdSwxYw|S)zReturn multiarch tag.zcannot get multiarchTexc_inforrrrS Exceptionlogrr rrTrUs r#rUzInterpreter.multiarchsv'1T\22 #//88 E99    II,tI < < <22 1&AAct|p|j}|jdkr,|tdz rd|jSdSdS)Nr r\zabi{})rrrr5majorr6s r# stableabizInterpreter.stableabisU'1T\22 9 ! !g&? !>>'-00 0 " ! ! !r%ct|p|j} ||\}}n-#t$r tddYdSwxYw|S)zReturn SOABI flag (used to in .so files). >>> i = Interpreter('python') >>> i.soabi(version=Version('3.3')) 'cpython-33m' zcannot get soabiTr^rr`rcs r#rTzInterpreter.soabi sw'1T\22 #//88 E99    II(4I 8 8 822  rdct|p|j}d|vr|dd\}}nd}t|}|sdS|}|drdSt ||}|dr3d|dd |dd|_|js|d s d |d pdvrd |_ | \}}n-#t$r tdd YdSwxYw|d}|j dkr)|jdz r| dr |dd}|ds|rFd||dp|}|ds|rd||dp|}|dz }||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' /rPrNrg)rverz{}.{}rrdflagsTzcannot get soabi/multiarchr^rr r\moduleirTrUz{}-{}z.so)rrrsplit EXTFILE_REr9r:rr5rrSrarbrrHr) r rMrrLinfoirTrUr.s r# check_extnamezInterpreter.check_extnames'1T\22 %<<,,sA..KD%%D  ''  F~~    F g . . . ; GtE{1~tE{1~FFAIw DM ST']5Hb-I-IAG  }} E99    II2TI B B B FF f 6Y  19#5 &//(:S:S CRC[F = PE P^^FDM,BUCCFK  PI P [0A0NYOO% F?? FD&!!!s"C::&D$#D$c<t|p|j}|jdks |jdkr|dz r|dzs |dz s|dkrd}nd}|dz }|||d } t jd |d <n#t$rYnwxYw|S) Nr'r r>rQrEzimport 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_MULTIARCHrP)rrrrXrosenvironKeyError)r rcmd conf_varss r#rSzInterpreter._get_configKs'1T\22 9  $)y"8"85 #9%,^#9e##9'.#~~*CC9C D DMM#w//55i@@  :&:;IaLL    D s6B BBTct|p|j}||d|f}|r ||jjvr|jj|St |}|ddkrIt |dtd ||d|d }t|dkr|d}|r||jj|<|S)Nz-c returncoderstderrz{} failed with status code {}stdoutrP) rrr- __class___cacherrbrrar5 splitlineslen)r commandrcacheoutputr.s r#rXzInterpreter._execute^s'1T\22::g&&g6  2W 555>(1 1!! , 1 $ $ IIfX& ' ' ';BB7FS_L`aabb b!,,.. v;;!  AYF  4-3DN !' * r%)NNNNNNN)FNNr1)NT)__name__ __module__ __qualname__rrrrrrrr$r*r/r2r- staticmethodrrArNrVrZrIrUrgrTrsrSrXr r%r#rr<s D DG E DG FAE04$$$$*((( (((\0$$$$LFFFF2 & & & & Y Y Y Y    1111 "/"/"/"/"b&r%r)loggingrwreos.pathrr debpythonrdebpython.versionrcompileVERBOSEr8rp getLoggerrrbrr r%r#rs* %%%%%% RZ     RZ j! "g!!uuuuuuuuuur%