簡體   English   中英

獲取從 bash 腳本運行的 Python 腳本的用戶輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM