用于通过http加载远程内存中python包/模块的模块

httpimport的Python项目详细描述


#` httpimport`
python缺少的特性!*

通过http/s导入远程、内存python包/模块**

[![PYPI版本](https://badge.fury.io/py/httpimport.svg)(https://pypi.python.org/pypi/httpimport)

直接导入到python解释器的进程内存中,通过**remote`uri`**,以及*更多*…

","github_repo","bitbucket_repo"]
````
``python
>;>httpimport.remote_repo(['package1','package2','package3','http://my codes.example.com/python_packages'):
…导入包1

````
``python
>;>;带有httpimport.github廑repo('operateQuals','covertutils',branch=master):
…导入covertutils
…#也适用于"bitbucket\u repo"
```
``python
>;a依赖于b,b依赖于c(a、b、c:不同域中的python模块/包):
>;a存在于"repo a.my codes.example.com"
>;b存在于"repo b.my codes.example.com"<;。--"repo c.my codes.example.com"中存在不同的域
>;>;>;>;具有httpimport.remote_repo(['c','http://repo c.my codes.example.com/python_packages'):
…具有httpimport.remote_repo(['b','http://repo b.my codes.example.com/python_packages'):
w使用httpimport.remote_repo(['a'],'http://repo_a.my codes.example.com/python_packages'):
…导入a
…#请求a,搜索b,请求b,搜索c,请求c-->;解析-->;导入a
>;
````
``python
>;>module_object=httpimport.load('package1','http://my codes.example.com/python_packages')
>;module_object
<;module'pac从http://my codes.example.com/python_packages/package1/uu init_uuu.py'>;```


\example-使用"simplehttpserver"的整个图片,整个目录可以通过http服务如下:

``bash
user@hostname:/tmp/test_directory$ls-r
.:
测试包

./测试包:
tory$
user@hostname:/tmp/test_directory$
user@hostname:/tmp/test_directory$curl http://localhost:8000/test_package/module1.py
127.0.0.1---[22/aug/2017 17:42:49]"get/test_package/module1.py http/1.1"200-






dummy_类:

def dummy_method(self):返回"类和方法已加载"





user@hostname:/tmp/test_directory$
user@hostname:/tmp/test_directory$curl http://localhost:8000/test_package/\uu init_u.py
127.0.0.1--[2017年8月22日17:45:20]"get/test_package/uu in it_uuu.py http/1.1"200-
uu all_uuu=["module1","module2"]

````


>使用这个简单的内置功能"py2/3",可以创建一个自定义导入程序,给定一个基本url和一个包名列表,它将获取并自动加载所有模块和包返回到本地名称空间。








>使用http repo制作http repo


``bash
user@hostname/tmp/test目录$ls-r

test_包


./test包:

./test包:

/test包:

user@hostname:/tmp/test_目录$python-m simplehttps服务于0.0.0.0.0端口8000上的http服务


````



35 35 35 35 35 35 35 35 \ \ \35 35 35 \他们将查找包的url年龄/模块和它可以提供的包/模块列表。

``python
>;>import test_package
traceback(最近一次调用的最后一次):
file"<;stdin>;",第1行,in<;module>;
importror:没有命名为test_package的模块tpimport import add_remote_repo,remove_remote_repo
>;在给定的url中,"test_package/"可用
>;>;add_remote_repo(['test_package','http://localhost:8000/');
>;>;import test_package
>;
>;>;remove_remote_repo('http:'//localhost:8000/)
>>gt>>>>>导入test_package.module1
tracebackback(最近一次调用最后一次):
file"<;stdin>;",第1行,in<;module>;
>importrororror:没有模块名module1

```




//` remote repo()`context
br/>u添加/>和移除远程repo可以b远程存储库的远程存储库和是的如果在**多个**回购协议中有可用的包,那就很痛苦了。因此,"with"关键字又起到了作用:

``python
>;>from http import import remote_repo
>;
>;
>;
>;>with remote_repo(['test_package','http://localhost:8000/'):
…从测试包导入模块1

>;
>;>已加载的模块1.dumm_func
<;函数dumm_func at 0x7f7a7a8a170410>;
```
>


```` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `重新加载模块(设置` httpimpimport.reloaload`标志):
`` python
importlib
import httpimport
>importhttpimport
>importhttpimport.httpimport

>httpimport.unsecure=true



<[莫]d'],'http://localhost:8000/a'):
import mod
print(mod.module_name())


with httpimport.remote_repo(['mod','http://localhost:8000/b'):
importlib.reload(mod)
import mod
print(mod.module_name())

httpimport.reload=true;允许重新加载模块

使用http import.remote_repo(['mod','http://localhost:8000/b'):
importlib.reload(mod)
import mod
print(mod.module_name())
````

尝试更改工作目录和包名,然后查看发生了什么……

`` bash
$python test.py
在端口8000上服务
127.0.0.1--[22/aug/2017 17:36:44]代码404,找不到消息文件
127.0.0.1--[22/aug/2017 17:36:44]"get/test_package/module1/u init_uuuu.py http/1。1"404-
127.0.0.1--[2017年8月22日17:36:44]"get/test_package/module1.py http/1.1"200-
常量加载
函数加载
类和方法加载

````



这样的http服务器(以目录结构的方式提供python包)可以在野外找到,而不仅仅是用"simplehttpserver"创建的。
**github repos也可以用作python https repos!!!!**

#Covertutils无法通过正常导入获得!
>;
>;>;covertutils\u url='https://raw.githubusercontent.com/operatiorequals/covertutils/master/'
>;>;
>;>;来自httpimport import remote\u repo的e_repo(['covertutils'],covertutils_url):
…import-import-coverutils

>>;gt;print-coverutils;print-print-coverutils。作者:john torakis-operatorequals
``





<
//****github_repo专用**`github_repo**`github repo()上下文:
````python
`` ``python
>>>>;来自httpimport-import-import-github github github'冠状病毒ertutils',):
…导入covertutils

>;>;covertutils.\uu author\uu
"john torakis-operatequals"
>;
`````

`` python
>>>来自httpimport-import-github-repo
>;,带有github-repo('operatequals','covertutils',branch='py3-u compatibility'):
…导入covertutils

>;>;covertutils.\uu author
"john torakis-operatequals"
>;
`````


如果你需要坚持一个固定的工作承诺怎么办?
`` python
>>gt;来自httpimport-import-github-repo
>>github-repo('operatequals','covertutils',commit='cf3f78c77c437edf2c291bd5b4ed27e0a93e6a77'):
…导入coverutils

>>;gt;gt;coverutils;coverutils。《美国作家》一书作者john torakis-operatorequals
>;
`````
`` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `‘bitbbucket’repo `(截至` 0.5.9`)` ` ` ` ` ` ` ` ` bitbbucket ` `(截至` 0.5.9`)` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `:
…import pybitbucket

>;
```

>>>>从http import导入远程回购
>>>使用远程回购(['b',"http://example.com/b_repo/"):
…使用远程回购(['a'],"http://example.com/a_repo/"):
…导入a
…< BR>]在http存储库中找不到"b"。
>gt;
>gt>gt>gt>a
>a
<;module'a'a'a'from'http://example.com/a\u repo/a/u init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuu.py'>;
>;b
<;module'b'b'a'a'a'a'a'a'a'a'a'a'b'frofrom'http://http://example.com/a/a\u repo/a/u repo/b.py'>;
>;
>>gt>gt;
>gt>gt>是的这种方式!

*the`[!]`为"a"创建的"httpimporter"对象发出警告,因为它找不到"b",并将控件传递给下一个"finder"对象,该对象恰好是为"b"创建的"httpimporter"对象!*

` load()`函数(从'0.5.10'开始)
添加了'load()`函数以使模块加载成为可能,而不会造成'namespace'污染。
`` python
>;>import httpimport
>;>pack1=httpimport.load('random-package','http://localhost:8000/')
>;>t;pack1
<;module"random package"from"http://localhost:8000//random package/\uu init\uuu.py">;
>;
>;
>;>尝试从url加载"os"模块将失败,因为它不会委托给其他查找程序/加载程序。
>;]在http存储库中找不到"不存在的包"。移动到下一个查找程序。
回溯(最近一次调用):
文件"<;stdin>;",第1行,在<;模块>;中
文件"httpimport.py",第287行,在加载中
提升importerror("模块'%s'不能从'%s'(模块名,url))导入
importerror:模块'os'不能导入编辑自"http://localhost:8000/"
```

导入只发生在正在运行的python进程上!
python模块测试的生活突然变得简单了!!!!
想象一下测试拉取请求和包的微风,你不确定它们是否适合你!


>;>logging.getlogger('httpimport').setlevel(logging.debug)
>;
>;>github回购('operatiorequals','covertutils'):
…导入CovertUtils

查找程序======
[!]正在搜索隐蔽应用程序
[!]路径为none
[@]检查连接是否为https secure>;
[@]检查是否在声明的远程模块名中>;
[@]检查是否内置>;
[@]检查是否为名称重复>;
[*]可以加载模块/包"covertutils"!
加载程序=====
[+]正在加载CoverUtils
[+]正在尝试从以下位置作为包导入:https://raw.githubusercontent.com/operateQuals/CoverUtils/master//CoverUtils/\u init\py'
[+]正在导入"CoverUtils"
[+]准备执行"CoverUtils"代码
[+]CoverUtils导入D成功!
>;
````



**
强烈建议在"localhost"接口之外使用带有**http url**的"httpimport"!_

由于未对http通信进行加密和/或完整性检查(与https不同),远程攻击者很容易拦截http响应(可能通过arp mitm),并将任意python代码添加到下载的包/模块中。
这将直接导致反执行到当前用户的上下文!换句话说,您将获得**完全f\*ed**…

电话:8000//’)
[!]使用非https url("http://localhost:8000//")可能会造成安全隐患!
[-]未设置httpimport.unsecure!正在中止…
回溯(最近一次调用):
文件"<;stdin>;",第1行,<;模块>;
文件"httpimport.py",第302行,在加载中
引发importorror("无法从url导入模块'%s'"(模块名,url))
importorror:无法导入模块'test_module'ORTED FROM URL:"http://localhost:8000/"
>;>;\抛出错误!
>;
>;
>;>必须故意启用从普通http导入!
>;>httpimport.unsecure=true
>;>httpimport.load('test_module','http://localhost:8000//')
[!]使用非https url("http://localhost:8000//")可能会造成安全隐患!
<;模块"test_module"来自"http://localhost:8000//test_module.py">;
>;>;成功!
```

将**https url**与"httpimport"一起使用!




关于[使用"httpimport"暂存"covertutils"后门代码](http://covertutils.readthedocs.io/en/latest/staging_exec.html)的技术文档,使*exe打包*和*不可读*代码加载*不包括模块依赖项*

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用(BluetoothGattCharacteristic)特性中的数据创建、写入和保存csv文件。getValue()   java如何使用groupBy创建一个值为BigDecimal字段平均值的映射?   日期时间Java将iso_即时格式的字符串转换为日期   java如何检索和显示Android firebase的配置文件?   scala AWSJAVASDK:解压缩大小必须小于262144000字节   要应用于列表的java JSTL if条件   java在3个点之间画一个正方形   Kotlin java抽象类IllegaAccessError   java原语双值相等取决于大小?   java有没有一种方法可以对数据集使用compareTo()方法,而不必遍历数据集的每个元素?   java为什么我发送的每个UDP消息都会改变端口源?   重新选择文件时swing Java JTree冻结   java不知道我的游戏是怎么回事   Motif L&F中自定义组合框渲染器中的Java Swing消失文本   java Trade Me API访问前的OAuth