在Python脚本中调用Python交互式解释器

-2 投票
2 回答
1939 浏览
提问于 2025-04-16 00:11

有没有办法在脚本中启动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...

非常感谢你!

...不过我还得再等一天才能接受这个...

撰写回答