2016-09-13 9 views
2

でテキストファイルを印刷すると、コンピュータのデフォルトプリンタでファイルの内容を印刷するプログラムを作成しようとしています。 私は周りに同様の質問をたくさんtheresのを知っているが、それらのどれもが私のPC上で動作しない(Linuxのミント17.3)ここ自分の小さなプロジェクト用にデフォルトプリンタ

は、私が試したものです、それは私が必要なものに最も近いを得た:

from subprocess import Popen 
from cStringIO import StringIO 

# place the output in a file like object 
sio = StringIO("test.txt") 

# call the system's lpr command 
p = Popen(["lpr"], stdin=sio, shell=True) 
output = p.communicate()[0] 

これは私に以下のエラーを与えます:

Traceback (most recent call last): 
    File "/home/vandeventer/x.py", line 8, in <module> 
    p = Popen(["lpr"], stdin=sio, shell=True) 
    File "/usr/lib/python2.7/subprocess.py", line 702, in __init__ 
    errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr) 
    File "/usr/lib/python2.7/subprocess.py", line 1117, in _get_handles 
    p2cread = stdin.fileno() 
AttributeError: 'cStringIO.StringI' object has no attribute 'fileno' 

Doe誰かがこれをpyoeで実装することができますか?それは実際にWindows上で動作している必要はありません

よろしく

シド・エル

+0

なぜ 'StringIO'ではなく' open'ですか? –

+0

@Moses Koledoyeあなたのコメントは両方のバグを修正:)私は私の答えの2番目の部分を書くときにそれを実現しました。 –

+0

「StringIO」はまた、最初に重複を検出することをより困難にしました。 –

答えて

2

あなたは、このためにStringIOを使用する必要はありません。ただ、subprocessのパイプ機能を使用してp.stdinにデータを書き込む:ボーナスとして

from subprocess import Popen 
# call the system's lpr command 
p = Popen(["lpr"], stdin=subprocess.PIPE, shell=True) # not sure you need shell=True for a simple command 
p.stdin.write("test.txt") 
output = p.communicate()[0] 

、これは、Python 3に準拠(StringIOは:)ので、名前が変更されました)

ですが:ちょうど印刷しています1行の大きい白いページ:test.txtlprは、標準入力を読み取り、それを印刷します(つまり:)まだコードの興味深い作品だ)

あなたはそれを読むために持っているあなたのファイルの内容を印刷するには、パイプ&ファイルが正しく動作するので、その場合にはそれも簡単です一緒に離れて:

from subprocess import Popen 
with open("test.txt") as f: 
    # call the system's lpr command 
    p = Popen(["lpr"], stdin=f, shell=True) # not sure you need shell=True for a simple command 
    output = p.communicate()[0] 
+0

その完璧!どうもありがとうございます!!!!!!!! –

+0

ps。私はそれを以前に開くと、これはpdfファイルを出力します。それは素晴らしい! –

+0

助けになることをうれしく思います。 –

関連する問題