]2N@sddlZddlZddlZddlZddlZddlZejeZGdddZ ddddddZ dddZ ed krd Z ye dZ Wn<e k rZzed ed ejWYddZ[XnXeje dS) Nc@seZdZdddddddZddZddZdd Zd d Zej d krrd dZ dddZ ddZ ddZ ddZddZddZddZdS) EnvBuilderFcCs1||_||_||_||_||_dS)N)system_site_packagesclearsymlinksupgradewith_pip)selfrrrrrr -/opt/alt/python35/lib64/python3.5/__init__.py__init__?s     zEnvBuilder.__init__cCstjj|}|j|}|j}d|_|j||j||jrc|j||j s|j ||j ||rd|_|j|dS)NFT) ospathabspathensure_directoriesrcreate_configuration setup_pythonr _setup_pipr setup_scripts post_setup)renv_dircontextZtrue_system_site_packagesr r r createGs          zEnvBuilder.createcCsxtj|D]n}tjj||}tjj|sOtjj|r_tj|qtjj|rtj |qWdS)N) r listdirr joinislinkisfileremoveisdirshutilrmtree)rr fnr r r clear_directoryas $zEnvBuilder.clear_directorycCsEdd}tjj|r4|jr4|j|tj}||_tjj|d|_ d|j |_ ||tj }t j dkrd|krtj d}n t j}tjjtjj|\}}||_||_||_t j dkr.d}d } tjj|d d } n8d }d } tjj|ddt jddd } tjj|| |_} || || t jdkrtjdkrt j dkrtjj|d} tjj| stjd| tjj|||_} ||_tjj| ||_|| |S)NcSsZtjj|s"tj|n4tjj|sFtjj|rVtd|dS)NzUnable to create directory %r)r r existsmakedirsrr ValueError)dr r r create_if_neededqs$z7EnvBuilder.ensure_directories..create_if_neededz(%s) darwin__PYVENV_LAUNCHER__win32ZScriptsZIncludeLibz site-packagesbinincludelibz python%d.%d posixlib64l)r r r"rr!typesSimpleNamespacersplitenv_namepromptenvironsysplatform executabler python_dirZ python_exer version_infoZinc_pathmaxsizenamesymlinkbin_pathbin_nameenv_exe)rrr&renvr;dirnameZexenameZbinnameZincpathZlibpathr Z link_pathbinpathr r r risL       $        zEnvBuilder.ensure_directoriesc Cstjj|jd|_}t|dddb}|jd|j|jr]d}nd}|jd||jd t j dd WdQRXdS) Nz pyvenv.cfgwencodingzutf-8z home = %s truefalsez"include-system-site-packages = %s zversion = %d.%d.%d ) r r rrZcfg_pathopenwriter<rr9r=)rrr fZinclr r r rs   zEnvBuilder.create_configurationntcCs:|jdrd}n|jdo3|jd}|S)N.pyd.dllTpythonz.exe)rPrQ)endswith startswith)rrNresultr r r include_binarys zEnvBuilder.include_binaryc Cs|j }|syKtjj|sZ|rJtjtjj||ntj||Wn+tk rtjd||d}YnX|rt j ||dS)NzUnable to symlink %r to %rT) rr r rr@basename Exceptionloggerwarningrcopyfile)rsrcdstrelative_symlinks_okZ force_copyr r r symlink_or_copys   zEnvBuilder.symlink_or_copycs|j}|j}|j}||j||j}tjdkrtjj|setj |dxBd D]e}tjj ||}tjj |sl||j|ddtjj|sltj |dqlWnd}|j fdd tj |D}xT|D]L} tjj || } tjj || } | |jkr|| | qWtjj ||}tjj|rfd d tj |D}xE|D]=} tjj || } tjj || } || | qWxtj|jD]\} } }d |krtjj| }tjj |jd |}tjj |sktj|tjj | d } tjj |d } tj| | PqWdS)NrOirRpython3r^TZDLLscs"g|]}|r|qSr r ).0rN)r-r r s z+EnvBuilder.setup_python..cs"g|]}|r|qSr r )rarN)r-r r rbs zinit.tclr+)rRr`)rArCr_r;r<r r?r rchmodrr"rVrrwalkrWrr#rr[)rrrFr copierrEsuffixZsubdirfilesrNr\r]rootdirsZtcldirr )r-r rsN      " " "  zEnvBuilder.setup_pythoncCs2|jddddg}tj|dtjdS)Nz-ImZ ensurepipz --upgradez --default-pipstderr)rC subprocess check_outputSTDOUT)rrcmdr r r rs zEnvBuilder._setup_pipcCsGtjjtjjt}tjj|d}|j||dS)Nscripts)r r rrE__file__rinstall_scripts)rrr r r r r s zEnvBuilder.setup_scriptscCsdS)Nr )rrr r r rszEnvBuilder.post_setupcCsm|jd|j}|jd|j}|jd|j}|jd|j}|jd|j}|S)NZ __VENV_DIR__Z __VENV_NAME__Z__VENV_PROMPT__Z__VENV_BIN_NAME__Z__VENV_PYTHON__)replacerr6r7rBrC)rtextrr r r replace_variables#s zEnvBuilder.replace_variablesc!Cs|j}t|}xtj|D]\}}}||krx:|ddD](}|dtjfkrQ|j|qQWq%x|D]} tjj|| } ||djtj dd} | s|} ntjj|| } tjj | s tj | tjj| | } t | d} | j }WdQRX| jdsy4|jd}|j||}|jd}Wn>tk r}zd}tjd| |WYdd}~XnX|dk rt | d} | j|WdQRXtj| | qWq%WdS)Ncommonr/rbz.exezutf-8z+unable to copy script %r, may be binary: %swb)rAlenr rdr?rr rr5sepr"r#rLreadrSdecodertencode UnicodeErrorrYrZrMrcopymode)rrr rFZplenrhrirgr%rNZsrcfilerfZdstdirZdstfiledataer r r rq5s@    &    zEnvBuilder.install_scriptsN)__name__ __module__ __qualname__r rr!rrr r?rVr_rrrrrtrqr r r r r's    7   3  rFc Cs2td|d|d|d|}|j|dS)Nrrrr)rr)rrrrrbuilderr r r res rc Cs"d}tjd,krd}nttds3d}|sHtdnddl}|jdtdd d d }|jd d ddddd|jdddddddddtj dkrd}nd}|j }|jdd|dddddd|jdd| dddddd |jd!dddddd"dd#|jd$dddddd%dd&|jd'dd(dddddd)|j |}|j r|j rtd*td+|jd"|j d|jd%|j d(|j}x|jD]}|j|qWdS)-NTrKF base_prefixz.This script is only for use with Python >= 3.3rprog descriptionzFCreates virtual Python environments in one or more target directories.epilogz|Once an environment has been created, you may wish to activate it, e.g. by sourcing an activate script in its bin directory.rimetavarZENV_DIRnargs+helpz)A directory to create the environment in.z--system-site-packagesdefaultaction store_truedest system_sitezDGive the virtual environment access to the system site-packages dir.rOz --symlinksrz[Try to use symlinks rather than copies, when symlinks are not the default for the platform.z--copies store_falsez\Try to use copies rather than symlinks, even when symlinks are the default for the platform.z--clearrzcDelete the contents of the environment directory if it already exists, before environment creation.z --upgraderzlUpgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place.z --without-piprz]Skips installing or upgrading pip in the virtual environment (pip is bootstrapped by default)z1you cannot supply --upgrade and --clear together.r)rKrK)r9r=hasattrr$argparseArgumentParserr add_argumentr r?add_mutually_exclusive_group parse_argsrrrrrrrir) argsZ compatiblerparserZ use_symlinksgroupoptionsrr%r r r main|sV                r__main__r'z Error: %sfile)loggingr rrkr9r3 getLoggerrrYrrrrcrXrprintrjexitr r r r s&      ?D  *