我在python启动脚本中添加了以下代码。在我通过pip安装pyreadline
后,它在Windows 7上运行良好,但它不适用于OS X Yosemite(10.10.2具体)。
import readline
def atPrompt():
import readline
global freshPrompt
if freshPrompt:
freshPrompt = False
last = readline.get_history_item(readline.get_current_history_length())
spaces = last[:len(last) - len(last.lstrip())]
if last.isspace():
spaces = spaces[:-4]
elif last and last.strip()[-1] == ':':
spaces += ' '
readline.insert_text(spaces)
readline.set_pre_input_hook(atPrompt)
# (I also make it so that when PS1 is called, global freshPrompt is set to True.)
当我输入交互式Python时,此代码会自动缩进。如果我输入的前一行以:
结尾,它会自动缩进四个额外的空格。如果前一行以空格开头但包含的空间不仅仅是空格,则它将新行与前一行对齐。如果前一行只是空格,它就是我的新行。
虽然这段代码在Windows上完全适用于我(来自pyreadline
的{{1}}),但它在OS X上没有任何作用。它没有告诉我任何模块丢失。我在OS X的其他地方使用pip
的{{1}}和readline
就好了。
如果我在get_history_item()
的开头插入get_current_history_length()
语句,它永远不会出现在OS X中,但在Windows中显示正常。
这让我认为print
在OS X中什么都不做。
我知道OS X中的atPrompt
模块与其他* nix发行版上的模块不同(出于许可的原因)。我听说可以在OS X上安装相同的模块。
但是当我尝试通过pip安装set_pre_input_hook()
时,用
readline
我收到以下错误:
创建build / lib.macosx-10.10-intel-2.7
cc -bundle -undefined dynamic_lookup -arch x86_64 -arch i386 -Wl,-F。 build / temp.macosx-10.10-intel-2.7 / Modules / 2.x / readline.o readline / libreadline.a readline / libhistory.a -lncurses -o build / lib.macosx-10.10-intel-2.7 / readline.so
clang:错误:没有这样的文件或目录:'readline / libreadline.a'
clang:错误:没有这样的文件或目录:'readline / libhistory.a'
错误:命令'cc'失败,退出状态为1
清理...... 命令/ usr / bin / python -c“import setuptools,tokenize;
readline
='/ private / tmp / pip_build_root / readline / setup.py'; exec(compile(getattr(tokenize,'open',open) (pip install readline
)。read()。replace('\ r \ n','\ n'),__file__
,'exec'))“install --record / tmp / pip-FYqn9p- record / install-record.txt --single-version-external-managed --compile失败,错误代码1在/ private / tmp / pip_build_root / readline中 在/Users/Taylor/Library/Logs/pip.log中存储失败的调试日志
(我在__file__
周围添加了反贴词,以防止它显示为文件。)
如何让__file__
使用OS X?我是否正确地认为我应该替换__file__
模块?如果是这样,我如何安装它,因为只是尝试通过set_pre_input_hook()
安装它会导致上述错误消息。
作为一个额外的细节,Windows机器正在运行Python 2.7.8。 OS X机器正在运行Python 2.7.6。
答案 0 :(得分:2)
执行此操作似乎最好的方法是安装gnureadline
。
pip install gnureadline
不幸的是,这意味着脚本可以跨平台兼容,您需要编写此代码:
try:
import gnureadline as readline
except ImportError:
import readline
而不仅仅是这个:
import readline
如果有人知道更好,更简洁的导入解决方案,请分享。