在Python脚本中调用Python交互式解释器
有没有办法在脚本中启动Python解释器,像使用 python -i
一样,这样可以保留当前脚本中的对象和命名空间?我不想用 python -i
的原因是因为我的脚本需要连接到一个XML-RPC服务器,如果出现错误,我需要能够停止整个程序。我不能一直循环等待有效输入,因为显然我不能这样做:
#!/usr/bin/python -i
# -*- coding: utf-8 -*-
import xmlrpclib
# Create an object to represent our server.
server_url = str(raw_input("Server: "))
while not server = xmlrpclib.Server(server_url):
print 'Unable to connect to server. Please try again'
else:
print 'Xmlrpclib.Server object `__main__.server\' of URL `', server_url, "' created"
break
# Python interpreter starts...
因为:
% chmod u+x ./rpcclient.py
% ./rpclient.py
Traceback (most recent call last):
File "./rpcclient.py", line 8
while not server = xmlrpclib.Server(server_url):
^
SyntaxError: invalid syntax
>>>
不幸的是,python -i
在打印出错误信息后才启动解释器,所以我必须在脚本内部调用交互式解释器,这样才能在保留服务器连接的情况下替代脚本的执行。
2 个回答
2
你有没有试着看看错误信息呢? :)
=
是用来赋值的,你应该用比较符号 ==
来进行比较。
0
好吧,我终于让它工作了。
基本上,我把整个 try
/except
/else
结构放进了一个 while True:
循环里,else
部分是一个 break
语句,而 except
部分的结尾是一个 continue
语句。这样一来,如果用户输入的地址没有一个完全合规的 XML-RPC2 服务器在监听,它就会不断循环。下面是我最终的代码:
#!/usr/bin/python -i
# -*- coding: utf-8 -*-
import xmlrpclib, socket
from sys import exit
# Create an object to represent our server.
#server = xmlrpclib.Server(server_url) and print 'Xmlrpclib.Server object `__main__.server\' of URL `', server_url, "' created"
server_url = str(raw_input("Server: "))
server = xmlrpclib.ServerProxy(server_url)
while True:
try:
server.system.listMethods()
except xmlrpclib.ProtocolError, socket.error:
print 'Unable to connect to server. Please try again'
server_url = str(raw_input("Server: "))
server = xmlrpclib.ServerProxy(server_url)
continue
except EOFError:
exit(1)
else:
break
print 'Xmlrpclib.Server object `__main__.server\' of URL `', server_url, "' created"
# Python interpreter starts...
非常感谢你!
...不过我还得再等一天才能接受这个...