2013-07-24 32 views
3

我的Python的歷史文件存在在〜/ .pyhistory幷包含以下內容:爲什麼readline.read_history_file給我「IO錯誤:[錯誤2]沒有這樣的文件或目錄」

from project.stuff import * 
quit() 
from project.stuff import * 
my_thing = Thing.objects.get(id=21025) 
my_thing 
my_thing.child_set.all() 
my_thing.current_state 
my_thing.summary_set 
my_thing.summary_set.all() 
[ x.type for x in my_thing.child_set.all() ] 
[ x.type for x in my_thing.child_set.all().order_by('datesubmitted') ] 
quit() 

我使用的virtualenv和virtualenvwrapper構建虛擬環境。今天,我遇到了我的歷史文件的readline不讀了一個問題:由我

>>> historyPath 
'/Users/johndoe/.pyhistory' 
>>> readline.read_history_file(historyPath) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 2] No such file or directory 

該文件是可讀可寫的:

[[email protected]]# ls -l ~/.pyhistory 
-rw------- 1 johndoe somegroup 325 21 Sep 2012 /Users/johndoe/.pyhistory 

什麼會導致這個問題?

回答

18

您的歷史記錄文件似乎是舊版本。嘗試將其轉換爲以更高版本的readline的期望的格式,最引人注目的是第一行應該是字面意思_HiStOrY_V2_「和所有空格應替換爲「\ 040」:

_HiStOrY_V2_ 
from\040project.stuff\040import\040* 
quit() 
from\040project.stuff\040import\040* 
my_thing\040=\040Thing.objects.get(id=21025) 
my_thing 
my_thing.child_set.all() 
my_thing.current_state 
my_thing.summary_set 
my_thing.summary_set.all() 
[\040x.type\040for\040x\040in\040my_thing.child_set.all()\040] 
[\040x.type\040for\040x\040in\040my_thing.child_set.all().order_by(\040'datesubmitted'\040)\040] 
quit() 

我不知道這是否是底層readline/libedit庫或Python readline模塊的一個怪癖,但是這對我來說很有用。

+0

將osx升級到小牛後遇到此問題。 readline版本必須已經更新或者其他東西。謝謝。 –

+2

我剛碰到這個。這是非常煩人的,錯誤是「沒有這樣的文件或目錄」,並且它是一個IOError。它應該像readline.FileParseError。並且該消息應該是「歷史文件中的預期版本2頭文件」 – onlynone

+2

我剛發現這是GNU的readline vs BSD的libedit的問題。我有一個virtualenv,其readline是針對libedit編譯的。它是libedit,期望有趣的標題和\ 040而不是空格。我係統範圍的自制python使用的readline是針對GNU的readline編譯的,它編寫的歷史文件沒有標題和常規空格。我通過刪除virtualenv並重新創建它來解決問題,以便它將指向與系統python相同的readline.so。 – onlynone

相關問題