stdinをbashスクリプトに渡し、そのbashスクリプトで呼び出されるpythonスクリプトに渡したい


9

filestdin経由でコンテンツをフィードしたいpythonスクリプトを呼び出すbashスクリプトがあります。次のようにbashスクリプトを呼び出します。

./script.sh < file

そしての内容script.sh

#! /usr/bin/env bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py ??????
deactivate
popd

bashスクリプト??????file与えられた内容をstdinとして pythonスクリプトに渡すために何を入力すればよいかわかりませんmain.py

fileかなりのテキストファイルとのbashのを使用することができるreadはないが望ましいです。

bashスクリプトを呼び出すときにstdinを使用する必要があります。私は何にでも渡すために柔軟ですmain.py

この難問に取り組む方法はありますか?

添加

@casの回答から、どのコンテキストで使用するかについても説明する必要があることがわかりましたscript.sh

転送スクリプトscript.shとして使用したいのですが、内容は次のとおりです。~/.forward

|/path/to/script.sh

どの接尾辞がとして呼び出され/path/to/script.shますか。ログはそれについて明確です。次のような、シンプルなバージョンのpythonスクリプトを使用した簡単なテスト:

|/path/to/simple/main.py

postfixがmain.py標準入力のメールの内容で呼び出すことを示します。しかし、この組み合わせは機能していないようです。


あなたはpostfix自身のlocalLDAまたは何か他のものを使っていますprocmaildeliver?内部から実行し~/.bashrcmain.pyときに見られるように、環境を乱す可能性のあるものはありますscript.shか?おそらく、{ typeset -p ; echo } >> "/tmp/forward.log"script.shの内部などを実行して、環境をログに記録します。
cas

回答:


15

main.pyスクリプトがstdinから読み取るように正しく記述されておりvenv/bin/activatestdin(*)からの読み取りでは??????何も「まったく何もない」と想定します。

Pythonの前にstdinを使用する以前のコマンドはbashスクリプトにないため、Pythonはそれを使用し始めるだけです。

#/bin/bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py
deactivate

または、main.py実行可能にして直接実行します./main.py。どちらの方法でも同じように機能します。

あった場合(*)は、おそらく変数にSTDINのすべてをキャプチャし、その後、配管等の醜い何かせずに、すべてでこれを行うことができないだろう<<<最初に変数をリダイレクトvenv/bin/activate当時とmain.py


ここで何が起こっているのか、なぜこれが機能するのかを示す非常に明白な例として、次のshスクリプトを検討してkitten.shください。

#!/bin/sh
cat

catstdinからの読み取りを開始し、その入力をstdoutに出力するだけで実行されます。


5
awww ...キティはとてもかわいい、それは独自のシバンラインを持っています。
cas

HI @cas幅広い回答ありがとうございます。そして、そうです。質問を拡張して、使用しようとしているコンテキストと機能しない場所を明確にしました。おそらく、このSEは質問をするのに間違ったフォーラムです。
nanitous

編集には6分以上かかりました;-)
nanitous

スクリプトの前半の他のコマンドがstdin(スクリプトの将来の編集など)を使用する必要がある場合、一部のオペレーティングシステムには、プレースホルダーとして渡される疑似ファイル名があります。たとえば、Linuxの多くのフレーバーの下に/dev/stdinは、デバイスファイル(またはそのようなものへのシンボリックリンク)があり、そこから読み取ると正しいことを実行します。もちろん、トレードオフは、ローカル変数を適切な偽のファイル名に割り当て、その変数をの引数として使用するなど、特別な名前がわかっているオペレーティングシステムに限定されることpython main.pyです。
Ti Strga

OPのスクリプトの目的はすべて、Pythonの環境を設定してからstdinをmain.pyに渡すことです。そうすることで、それが機能しなくなってしまいます。
cas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.