簡體   English   中英

編寫Python腳本以使用控制台命令執行

[英]Writing a Python script to execute with a console command

研究在底部,在-1之前閱讀...謝謝。

我必須編寫一個運行SQL查詢的Python腳本。 我創建了一個主類並調用了SQLQuery。 每個SQLQuery實例代表一個查詢。 腳本的結構必須如下:

class SQLQuery(object):

     def __init___(self, string_myQuery)...

instance1 = SQLQuery(SQLQuery1)...

instance2 = SQLQuery(SQLQuery2)...

作為用戶要求,實例必須與類位於同一文件中(因此我不能只將每個實例作為主要文件並單獨執行該文件),並且必須使用Linux控制台命令執行每個實例。 我可以使用簡單的python SQLQuery.py執行整個腳本,但我需要單獨執行每個實例。 查詢將每天自動執行,因此我不需要終端UI樹。 它應該使用類似於下面的命令執行:

python SQLQuery.py -inst1

將執行instance1。

python SQLQuery.py -inst2

將執行instance2。

我研究了如何使用Linux命令執行Python腳本,大多數文章都是關於從Python腳本調用命令。 但是,我從Python文檔中找到了這篇文章 它建議添加-m,所以:

python SQLQuery.py -m inst1

這將讓我使用控制台命令設置我的主,但它不起作用,因為實例不是模塊。 由於實例必須與類在同一個文件中,因此當我使用控制台命令執行SQLQuery.py時,我不能將它們作為模塊導入。

忽略所有無關緊要,聽起來你的問題是你有一堆名為instance1instance2instance3等的全局對象,並且你想根據一個命令行參數調用其中一個方法,其值為與實例名稱相似但不相同。

這可能不是一個好主意......但並不是那么難:

if __name__ == '__main__':
    inst = sys.argv[1] # will be 'inst1', 'inst13', etc.
    inst_number = inst[5:] # so '1', '13', etc.
    inst_name = 'instance' + inst_number
    instance = globals()[inst_name]
    instance.execute()

做同樣事情的更好方法是將instance全局變量放入可以索引的列表或字典中。

例如,假設代替instance1instance2等,你有一個instances dict, instances['1']instances[2]等。現在代替這個:

inst_name = 'instance' + inst_number
instance = globals()[inst_name]
instance.execute()

......你這樣做:

instances[inst_number].execute()

此外,不是想出一個命令行參數,其中包含額外的東西,你必須解析並丟棄,並且對於人類讀者而言沒有比代碼更多的意義,為什么不只是取一個數字呢?

python myscript.py 12

或者,使用argparse創建一個可以以所有顯而易見的方式使用的參數:

python myscript.py --instance=12
python myscript.py --instance 12
python myscript.py -i12
python myscript.py -i 12

無論哪種方式,您的代碼都會獲得字符串'12' ,然后可以使用它來查找函數,如上所述。

您的-m選項語法錯誤。 假設您有以下名為foo.py文件:

import sys
print 'First arg is: ', sys.argv[1]

然后你會這樣稱呼它:

$ python -m foo bar
First arg is:  bar

請注意,省略了“.py”擴展名。 然后,您可以使用命令行參數來決定使用哪個對象,或使用argparseoptparse模塊來處理參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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