[英]Get user input for a Python script ran from a bash script
Tldr 最后
我有一個簡單的 Python 腳本,其中包含幾個函數,讓我們以這個main.py
為例:
import sys
def userAdd():
var = input("Please type any input: ")
print("My input is", var)
if __name__ == '__main__':
globals()[sys.argv[1]]()
當我打電話時:
python main.py userAdd
一切正常。 腳本運行,Python 控制台詢問我的輸入,然后編輯 JSON 文件。 現在我希望每次編輯文本文件時都執行此腳本,假設myfile.txt
現在只有這一行:
foo
為此,我使用這個 bash 腳本並將"RUN COMMAND"
行更改為python main.py userAdd
(我們稱之為update.sh
):
#!/bin/bash
### Set initial time of file
LTIME=`stat -c %Z ./myfile.txt`
while true
do
ATIME=`stat -c %Z ./myfile.txt`
if [[ "$ATIME" != "$LTIME" ]]
then
python main.py userAdd
LTIME=$ATIME
fi
sleep 1
done
我的問題發生在這里。 每次從 Bash 腳本調用 Python 腳本時,都會出現輸入提示。 我輸入一個值,然后得到一個bash: <input> command not found
,這意味着我正在使用的當前 tty 不是 Python,而是 Bash
$ chmod +x update.sh
$ ./update.sh &
$ echo "bar" >> myfile.txt
$ Please type any input: test
bash: test : command not found
我嘗試了一些方法(使用 /usr/bin/env 和 /dev/tty 或 <&1 ,或使用python -i
)。
tldr; 我的 Python 腳本要求用戶輸入以更新文件。 當我直接從我的 bash 終端 ( python main.py myfunction ) 運行它時,它工作正常。 當我從 Bash 腳本(包含相同的 python [...]行)運行此 Python 腳本並輸入我的輸入時,我得到一個bash <input> command not found
。 這意味着終端不是 Python 的而是 Bash 的。 在這種情況下,我怎樣才能得到一個 Python 終端來接受我的輸入?
對於可能面臨相同問題的任何人,以下是我的解決方法:我編輯了update.sh
中的行,調用 Python 腳本,如下所示:
#!/bin/bash
### Set initial time of file
LTIME=`stat -c %s ./myfile.txt`
while true
do
ATIME=`stat -c %s ./myfile.txt`
if [[ "$ATIME" >= "$LTIME" ]]
then
/usr/bin/konsole -e /usr/bin/bash -c './main.py userAdd'
LTIME=$ATIME
fi
sleep 1
done
所以這條線將我綁定到一個特定的終端,但我認為這很容易被更高級的 Linux 用戶繞過。
然后,當我使用./update.sh &
運行腳本並將此行添加到 cron 時,每次我編輯並關閉文件時,都會運行一個新終端,要求輸入打印結果然后關閉(盡管為了該示例應在print()
之后添加wait()
命令)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.