0

サブプロセスを使用してnanoを呼び出してファイルに書き込み/追加し、自動的に保存するにはどうすればよいですか。たとえば、ファイルがあり、それを開いて最後に何かを追加したいので、書き込みます

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile(mode='a')
>>> example = file.name
>>> f.close()
>>> import subprocess
>>> subprocess.call(['nano', example])

最後の行が実行されると、ファイルが開き、何でも書き込んで、Ctrl+O と Ctrl+X を押して保存できます。

代わりに、stdin PIPE を介して入力を送信し、ファイルが自動的に保存されるようにします。つまり、Ctrl+O および Ctrl+X を自動的にヒットするメカニズムが存在する可能性があります。

この問題を解決するのに役立ちますか?

4

2 に答える 2

1

ctrl-O は、他の文字と同じように単なる文字です。書くことで送信できます'\x0f'(または、Python 3 では、b'\x0f')。

しかし、それはおそらくあなたに何の役にも立たないでしょう。ターミナルでインタラクティブな GUI を提供するほとんどのプログラムは、nanostdin によって駆動できません。彼らは端末を制御する必要があり、それを行うには、そのstdinisattyをチェックしてからそれをチェックするかtcsetattr、単に open /dev/tty

os.openptyos.forkpty、またはで疑似端末を作成することで、これに対処できますpty

pexpectしかし、多くの場合、インタラクティブなプログラムや GUI などを扱うようなライブラリを使用する方が簡単です。

そもそも対話型プログラムを実行しようとしない方が簡単です。たとえば、 とは異なりnanoedはスクリプトによって「バッチ モード」で駆動されるように設計されており、sedさらにそのように設計されています。

また、Python で直接簡単に実行できることを実行しようとしているときに、プログラムをまったく実行しない方が簡単です。ファイルに何かを追加する最も簡単な方法はopen'a'モードでファイルに追加writeすることです。外部プログラムはまったく必要ありません。例えば:

new_line = input('What do you want to add?')
with open(fname, 'a') as f:
    f.write(new_line)

あなたが使用していた唯一の理由がnano何かが必要だったからであるならsudo…その理由は本当にありません. や別の Python スクリプトなど、sudo他のことも同じように簡単に行うことができます。sedを使用するnanoと、まったく理由もなく、自分にとって物事が難しくなります。


ここでの大きな問題は、Python スクリプトで書き込みできないファイルがあるのに、任意のリモート ユーザーが追加できるようにしたいのはなぜですか? それは非常に悪いシステム設計のように思えます。通常のユーザーによるファイルの変更を制限するために、ファイルを書き込み不可にします。リモート ユーザーに代わって Python スクリプトでスクリプトを変更できるようにしたい場合、スクリプトを実行するのと同じユーザーが所有していないのはなぜでしょうか?

于 2014-08-10T10:25:01.423 に答える
0

Python プロセスからnanoやその他の対話型プログラムを制御する必要があるという (ありそうにない) イベントでは、この質問で提案したのと同じことをここで提案します: Using python subprocess.call() ncurses プロセスを起動するには...

... curses/全画面対話プロセスを制御するためにサブプロセスを使用しないでください。pexpectを使用します。それがそのためです。

(一方で、権限の問題を回避するためのより良い方法に関する多くのコメントにも同意します。sudo実行でき、in -編集または付録をデータ ファイルに直接配置します。

于 2014-08-10T11:50:12.643 に答える