2012-11-15 59 views
1

我試圖設置一個條形碼掃描儀對象,將捕獲掃描儀本身的任何輸入。條形碼掃描儀被識別爲標準輸入(標準輸入),因此無論何時掃描條形碼,我都會得到標準輸入文本。還會有一個鍵盤連接到系統,這是另一個標準輸入。爲了區分條形碼掃描輸入和鍵盤輸入,我將使用任何條形碼信息的前綴。換句話說,如果我的條形碼總長度爲16個字符,則前4個將預定的字符串/鍵表示以下12個字符是條形碼輸入。這是我讀過的非常標準的。Python重定向stdin

現在我見過的大多數例子都會通過捕獲GUI應用程序中的字符輸入事件來識別條碼輸入。這個事件回調方法然後建立一個緩衝區來檢查4個字符的前綴並根據需要重定向條形碼輸入。事件回調方法也會跳過任何不是條形碼相關的字符輸入事件,並允許它們作爲標準輸入通常會與GUI進行交互(鍵入文本框或您有什麼)。

我想做同樣的事情,除了沒有使用GUI應用程序。我希望我的條形碼掃描器對象獨立於GUI應用程序。理想情況下,我會在條形碼掃描器對象中使用回調方法,每次輸入字符時stdin都會調用。從那裏,我會通過檢查4個字符的前綴來獲取任何條形碼輸入,並且可以傳遞除條形碼輸入之外的任何字符。換句話說,我希望stdin通過我的條形碼掃描器回調方法,然後讓我的條形碼掃描器回調方法能夠將非條形碼字符作爲標準輸入返回,就像什麼都沒有發生過一樣(仍然是標準輸入那會去一個文本框或什麼的)。

這可能沒有一個while循環不斷監測標準輸入?即使我有一個while循環監視標準輸入,如果不是條形碼輸入,我如何將字符作爲標準輸出抽出?我研究過使用pyusb接管條碼掃描儀的USB接口,但這需要root權限才能與硬件交互(不是我項目的選項)。任何幫助將不勝感激。我還沒有找到一個這樣的例子。

編輯:此項目將運行在CentOS或Linux的某些味道。

+0

編程中的一個常見主題。如何將兩個數據流合併到一個通道並在另一側再次分離出來?你必須有框架或轉義序列,或者什麼東西,告訴你到底哪些數據屬於哪個流,何時開始和結束,等等。 – wberry

+0

@wberry在這種情況下,我將有一個前綴和轉義序列來確定哪些文本屬於條形碼輸入。真的,我只需要弄清楚如何讓stdin爲每個字符輸入調用我的方法之一,並且能夠將字符作爲標準輸入返回。 – user1777820

+0

如果你使用* nix,你不能只通過一些把它分成兩個輸出管或類似的東西來管stdin嗎? – martineau

回答

1

在Unix中攔截標準輸入的正常方式是管道和多個進程。如果您有多進程應用程序,那麼一個進程可以接收「原始」標準輸入,捕獲條形碼輸入,並將其餘的傳遞給其標準輸出。那麼這個輸出將會是你的UI過程的標準輸入,它只接收非條形碼數據。要最初設置它,只需一個啓動進程即可設置管道,啓動其他兩個進程並退出。

如果你是新來的這些概念,你有一個漫長而有趣的學習過程之前,你:-)

這一切假設你真的接受通過標準輸入「鍵盤」的數據,而不是通過你似乎暗示的X11事件。如果您在X11(或GTK等)內開發,那麼我所描述的幾乎肯定不起作用。

+0

我對管道和多個進程之間的通信有點熟悉,但是沒有足夠的設置來完成這些工作,但總是需要學習新的東西,謝謝指引我朝着正確的方向發展。 ! – user1777820

+0

這最終沒有像我想象的那麼困難,並且是我的問題的唯一解決方案,不需要uire root權限(我遇到過)。我學會了如何在python進程之間進行管道連接!再次感謝 :) – user1777820