使用python共享文件

来源:互联网 发布:江彬和钱宁 知乎 编辑:程序博客网 时间:2024/05/17 23:39

当我们想要将自己电脑上面当文件共享出去时,往往会通过设置共享文件夹或者使用第三方软件等方式来实现。这么做的缺点在于,操作繁琐,而且不同系统下的操作方式也不一样,很不方便。那有没有一种通用的,快捷的共享文件方式呢?答案是肯定的,通过python,我们可以轻易的实现这一点。

python -m SimpleHTTPServer [port]

上述命令可以将当前目录作为一个文件服务器,服务器地址为你的ip:[port]。port参数可不填,默认端口为8000。因此,在同一局域网下,别人就可以通过你的ip:[port]这个地址访问到你当前文件夹下的所有文件。
那每次都要输入这个命令,还是很麻烦的。为此,我们可以给这命令设置一个简单又好记的别名,就叫它share好了。

mac/linux下:
打开 ~/.bashrc文件,在最后一行加上:

alias share="python -m SimpleHTTPServer"

保存退出后,执行source ~/.bashrc即可。以后再想共享文件,只需要cd到指定目录,输入share命令就可以了,是不是很方便呢!

windows用户设置别名稍微有点麻烦:
在你喜欢的地方新建一个文件,将它命名为env.bat或者其他你喜欢的名字.bat,输入如下内容:

@echo offdoskey share=python -m SimpleHTTPServer

然后在注册表HKEY_CURRENT_USER\Software\Microsoft\Command Processor下面加一项AutoRun,把值设为你的脚本路径。
或者新建文件auto.reg,输入以下命令:

Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]"AutoRun"="%USERPROFILE%\\env.bat"

具体可参考windows系统如何给命令起别名?上述内容操作完毕后,即可像mac/linux系统一样,在指定目录输入share命令即可共享该文件夹下的所有内容。


通过这种方式最终在控制台显示的内容为:
Serving HTTP on 0.0.0.0 port 8000

如果给别人共享文件,此时还需要另外查询一次本机ip,比较繁琐。

python -m SimpleHTTPServer [port]

这行命令调用了SimpleHTTPServer模块的main()方法。我们进入到该类中:

def test(HandlerClass = SimpleHTTPRequestHandler,         ServerClass = BaseHTTPServer.HTTPServer):    BaseHTTPServer.test(HandlerClass, ServerClass)if __name__ == '__main__':    test()

发现它最终调用了BaseHTTPServer类的test方法,继续跟进去:

def test(HandlerClass = BaseHTTPRequestHandler,         ServerClass = HTTPServer, protocol="HTTP/1.0"):    """Test the HTTP request handler class.    This runs an HTTP server on port 8000 (or the first command line    argument).    """    if sys.argv[1:]:        port = int(sys.argv[1])    else:        port = 8000    server_address = ('', port)    HandlerClass.protocol_version = protocol    httpd = ServerClass(server_address, HandlerClass)    sa = httpd.socket.getsockname()    print "Serving HTTP on", sa[0], "port", sa[1], "..."    httpd.serve_forever()

可以看到我们控制台打印的内容就在代码的倒数第二行。下述代码可以获取本机ip:

myname = socket.getfqdn(socket.gethostname())myaddr = socket.gethostbyname(myname)print myaddr

因此我们只需要将代码修改为下述这种即可:

def test(HandlerClass = BaseHTTPRequestHandler,         ServerClass = HTTPServer, protocol="HTTP/1.0"):    """Test the HTTP request handler class.    This runs an HTTP server on port 8000 (or the first command line    argument).    """    if sys.argv[1:]:        port = int(sys.argv[1])    else:        port = 8000    server_address = ('', port)    HandlerClass.protocol_version = protocol    httpd = ServerClass(server_address, HandlerClass)    myname = socket.getfqdn(socket.gethostname())    myaddr = socket.gethostbyname(myname)    sa = httpd.socket.getsockname()    # print "Serving HTTP on", sa[0], "port", sa[1], "..."    print "Serving HTTP on", myaddr, "port", sa[1], "..."    httpd.serve_forever()

此时再在控制台输入”share”命令,即可打印本机ip。