2013-05-17 28 views
0

研究是在底部,閱讀之前-1'ing ...謝謝。編寫一個Python腳本來執行一個控制檯命令

我必須編寫一個運行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文檔中找到了this article。它建議加入-m,所以:

python SQLQuery.py -m inst1 

這將讓我把我的主用控制檯命令,但它不工作,因爲實例不是模塊。由於實例必須與類相同,因此當我使用console命令執行SQLQuery.py時,我不能將它們作爲模塊導入。

+0

爲什麼不只是傳遞一個命令行參數給腳本,告訴腳本運行哪個實例? – martineau

+2

你提出的結構是沒有意義的。 'SQLQuery'本身就是一個基類,並且將自己當作一個'__init__'參數?此外,什麼是'MainClass'和'SQLQuery1'? – abarnert

+0

此外,該文件在哪裏建議添加'-m'?它描述了'-m'如何作爲'python'本身的參數,它的意思是按名稱查找和執行一個模塊;這並不意味着什麼'-m'應該作爲腳本的參數。 – abarnert

回答

1

忽略所有不相干的,這聽起來像你的問題是,你有一堆名爲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字典,用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',它可以再使用如上所述查找功能。

+0

謝謝,如果我有更多的代表,我會贊成。其他人都選擇了不相干的東西,並低估了我,因爲他們無法找到我在帖子底部所做的研究。我想下次我會把我的研究全部放在最前面。 我會嘗試將實例放入字典中。這似乎是最簡單和最乾淨的解決方案,並且它不必是人類可讀的,因爲命令將由服務器每天在定時器上運行。 – JaneGoodall

+0

@JaneGoodall:作爲提問者,接受正確的答案更重要 - 或者對最好的答案進行評論以解釋如何在值得接受之前改進它 - 而不是提高評分。 – abarnert

1

您對-m選項的語法錯誤。假設你有以下文件命名爲foo.py

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

那麼你會這樣稱呼它:

$ python -m foo bar 
First arg is: bar 

注意「py」爲擴展名被省略。然後,您可以使用命令行參數來決定使用哪個對象,或者使用​​或optparse模塊來處理參數。

+0

謝謝bogatron,但我無法調用外部文件。這是用戶需求。 – JaneGoodall

+0

也許我不理解你的問題。我並不是建議你調用外部文件。上面的'foo.py'文件是你的'SQLQuery.py'文件。您可以使用命令行參數來決定在文件中使用哪個對象。如果你試圖在現有的python進程中創建命令行調用來創建新的對象,那麼你應該考慮python的'multiprocessing'模塊,它可以讓你輕鬆地設置一個服務器進程,你可以從命令行訪問在模塊中創建新的對象。 – bogatron

相關問題