import console; import process.python; import inet.httpFile; namespace process.python; class pip { ctor( ... ){ if( ..string.cmp(..process.python.path,"python.exe")!=0 ){ var pyRoot = ..io.splitpath(..process.python.path).dir; if(!( ..io.exist(..io.joinpath(pyRoot,"\pip\pip\__init__.py")) || ..io.exist("\pip\pip\__init__.py") )){ var majorVersion,minorVersion = ..string.match(..process.python.version:"","(\d+)\.(\d+)"); var getPipUrl; if(majorVersion==="3" && (tonumber(minorVersion) <= 8 )){ getPipUrl = "https://bootstrap.pypa.io/pip/"+majorVersion+"."+minorVersion+"/get-pip.py"; } else{ getPipUrl = "https://bootstrap.pypa.io/get-pip.py"; } if(majorVersion && minorVersion){ pipSavePath = ..io.appData("aardio/std/pip/"+majorVersion+"."+minorVersion+"/get-pip.py"); } else{ pipSavePath = ..io.appData("aardio/std/pip/latest/get-pip.py"); } ..console.showLoading(" 请稍候,正在初始化 get-pip.py"); import console.progress; var progress = console.progress(); var downloadPipInstaller = function(url){ progress.reset(); var remoteFile = ..inet.httpFile(url,pipSavePath) remoteFile.onReceiveBegin = function(statusCode,contentLength,fileSize){ if( statusCode == 206/*断点续传*/ ){ progress.setProgress((fileSize/contentLength)*100,"继续下载 get-pip.py") } elseif(fileSize){ progress.setProgress((fileSize/contentLength)*100,"开始下载 get-pip.py") } } remoteFile.onReceive = function(str,downSize,contentLength){ progress.addProgress((downSize/contentLength)*100 ,"正在下载 get-pip.py 文件大小:" + ..math.size64(contentLength).format() ) } var ok,err,fileSize = remoteFile.download() return ok,err,fileSize; } var pyCode; if( (majorVersion==="3") && (minorVersion=="8") ){ pyCode = ..string.load("~\lib\py3\.res\get-pip.py") || ..string.load(pipSavePath); } if(!#pyCode){ if(!downloadPipInstaller(getPipUrl) && !downloadPipInstaller("https://mirrors.aliyun.com/pypi/get-pip.py")){ error("pip 下载失败!"); } pyCode = ..string.load(pipSavePath) } progress.clear(); ..console.log("正在安装 pip ……"); var python = ..process.python.exec(pyCode,"--no-warn-script-location"); python.logResponse(); python.close(); if(..process.python.path=="/py/python.exe"){ ..fsys.enum( pyRoot, "*._pth", function(dirname,filename,fullpath,findData){ if(filename){ if( ..fsys.replace(fullpath,"\N+\s*import\s+site",'../pip\r\n./Lib\r\nimport site') ){ return false; } } },false ); if(..io.exist(..io.joinpath(pyRoot,"\Lib\site-packages\pip\__init__.py"))){ ..fsys.delete("\pip\"); ..fsys.move(..io.joinpath(pyRoot,"\Lib\site-packages") ,"\pip\" ); } } else { ..fsys.enum( pyRoot, "*._pth", function(dirname,filename,fullpath,findData){ if(filename){ if( ..fsys.replace(fullpath,"\N+\s*import\s+site",'./pip\r\n./Lib\r\nimport site') ){ return false; } } },false ); if(..io.exist(..io.joinpath(pyRoot,"\Lib\site-packages\pip\__init__.py"))){ ..fsys.delete(..io.joinpath(pyRoot,"\pip\") ); ..fsys.move(..io.joinpath(pyRoot,"\Lib\site-packages") ,..io.joinpath(pyRoot,"\pip\") ); } } ..fsys.delete("\py\Scripts"); } } ..console.open(); var args = ..string.cmdline.arguments(...); if(args[1]=="install"){ var target; var pip; for(i=1;#args;1){ if(args[i]=="pip"){ pip = true; } elseif(args[i]=="-t" || args[i]=="--target" ){ if(args[i+1]){ args[i+1] = ..io.fullpath(args[i+1]); break; } target = true; } } if(pip){ ..table.push(args,"-t",..io.fullpath(..io.joinpath(pyRoot,"\pip\"))); } elseif(self.target) { ..table.push(args,"-t",..io.fullpath(self.target)); } } var python = ..process.python.module("pip",args); python.logResponse(); python.close(); }; } namespace pip{ setIndexUrl = function(url){ if(url){ if(url=="aliyun") url = "https://mirrors.aliyun.com/pypi/simple/"; elseif(url=="tsinghua") url = "https://pypi.tuna.tsinghua.edu.cn/simple" elseif(url=="tencent") url = "http://mirrors.cloud.tencent.com/pypi/simple" elseif(url=="douban") url = "http://pypi.douban.com/simple/" ..process.python.pip(" config set global.index-url " + url); } else { ..process.python.pip(" config set global.index-url https://pypi.org/simple"); } } upgrade = function(){ ..process.python.pip("install --upgrade pip"); } require = function(name){ if(!..process.python.test("import "+name)){ ..process.python.pip("install "+name); } } github = function(url){ import web.rest.github; var r = web.rest.github.getContent(url); if(r){ var name = ..string.random(10)+"requirements.txt"; var path = ..io.joinpath( ..process.python.workDir,name); ..string.save(path,r); var r,e = ..process.python.pip("install","-r",name); ..io.remove(path); return re,e; } } } /**intellisense() process.python.pip = Python 模块安装工具。\n\n如果 process.python.path 的值为 "python.exe" 则调用系统安装的 pip,\n否则自动安装 pip 到 python.exe 所在目录的 pip 目录下,请不要改为其他名称。\n在安装 pip 时会修改 python.exe 所在目录的 *._pth 文件。\n如果已安装 pip 则自动跳过。\n\n此工具可用于发布后的程序 process.python.pip("install","__/*模块名称*/") = 执行 pip 命令,只能在开发环境单独运行。\n可用一个字符串参数指定多个 pip 参数,空格分隔多个参数,\n也可以传入多个参数由 aardio 自动合并(空格分隔参数),\n合并多参数时,单参数含空格或需转义时自动加双引号并自动转义。\n\n默认安装模块到 "/py/site-packages" 目录下\n\n如果不指定任何参数,直接返回 pip 模块对象。\n可用一个字符串数组指定 pip.main 函数的启动参数 process.python.pip.setIndexUrl("aliyun") = 设置镜像源。\n参数指定源网址,支持常用镜像源缩写。\n"aliyun" 表示阿里云源,\n"tsinghua" 表示清化源,\n"tencent" 表示腾讯源,\n"douban" 表示豆瓣源,\n参数为空恢复默认。 process.python.pip.require("__") = 如果没有安装指定的模块,则调用 pip 安装 process.python.pip.github("__") = 自动安装 GitHub 的 Python 项目依赖模块。\n参数中指定 GitHub 上 Python 项目 requirements.txt 地址。\n如果网址包含 blob 或 raw 则不用指定域名 process.python.pip.target = 指定安装模块的目录,\n此目录仅用于安装,不会被添加到 process.python 的模块搜索路径 end intellisense**/