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