2012-06-01 25 views
2

我有GetVars()函數(不應該改變),它在某些情況下拋出sys.exit(1)。 我想要做一些清理這種情況:是否可以在sys.exit(1)之後使用import?

try: 
    common_func.GetVars() 
except SystemExit: 
    cmdline = "-user user1" 
    sys.argv = ['config.py', cmdline] 
    import config 

config.py應該採取一些ARGS,但它包含的唯一print語句了。但它沒有被執行 - 有沒有辦法做到這一點?現在 我試圖運行

cur_dir = os.path.dirname(os.path.realpath(__file__)) 
gcti_cfgDir = os.path.join(cur_dir, "..", "cfg-scripts") 
sys.path.append(gcti_cfgDir) 
import config 
try: 
    sys.exit(1) 
except SystemExit: 
    try: 
    import config 
    except: 
    print "errr" 
+3

你能告訴我們config.py嗎? – robert

+3

http://sscce.org/ – Marcin

+0

也許嘗試使用'os'或'subprocess'調用你的config.py文件而不是導入它,因爲你說它需要參數? –

回答

4

我這個mymodule.py文件試過

$ python mymodule.py 
Everything is ok for now 

我大多肯定這個問題不在進口本身,也不在SystemExit ca pturing ...可能您的config.py文件已損壞。

UPDATE:啊,我相信我明白了!

根據你的新代碼,您在sys.exit(1)之前導入config模塊,並在except塊導入它,太:

import config # <-- here... 
try: 
    sys.exit(1) 
except SystemExit: 
    try:  
    import config # <-- and here 
    except: 
    print "errr" 

然而,模塊的代碼在第一隻執行進口。以下幾個將模塊放在名稱空間中,或者如果它已經在名稱空間中,則什麼也不做。

正如我所看到的,最好的解決方案是在模塊中定義一個函數。如果這是你的模塊的內容:

print "Everything is ok for now" 

只是

def run(): 
    print "Everything is ok for now" 

和替代進口,你想讓它要執行的模塊替換它,導入它只有一次,調用該函數:

import config # This line just imports, does not print nothing 
config.run() # OTOH, this one prints the line... 
try: 
    sys.exit(1) 
except SystemExit: 
    try:  
    config.run() # This one prints the line too 
    except: 
    print "errr" 

其實,這是肯定的代碼在Python處理的最佳方式:把代碼放到功能,把功能分成模塊,調用的函數。正如你試圖做的那樣,將可執行代碼直接放在模塊中通常不是一個好習慣。

月2日更新:如果你不能改變config.py模塊的代碼,你可以使用subprocess.call調用Python解釋器仍然調用它。你甚至可以通過你試圖添加到sys.argv的參數:

import subprocess 
# ... 
subprocess.call(['python', 'config.py']) 
try: 
    sys.exit(1) 
except SystemExit: 
    try: 
    subprocess.call(['python', 'config.py', "-user", "user1"]) # Extra args 
    except:  
    print "errr" 
+0

config.py包含打印「hi!」的1行 – Francheska

+0

我將更新添加到我的初始帖子 – Francheska

+1

@Francheska哦,我想我發現了這個問題。閱讀我更新的問題。 – brandizzi

2

使用atexit模塊註冊清理處理程序,或者如果你是肯定的:只是想了解發生了什麼,我知道代碼看起來很奇怪:)

UPD GetVarssys.exit,猴子給後者拋出一個自定義的異常而不是真正的運行,這樣你就可以捕獲它並手動處理它。

$ cat mymodule.py 
import sys 

try: 
    sys.exit(1) 
except SystemExit: 
    cmdline = "-user user1" 
    sys.argv = ['config.py', cmdline] 
    import config 

以及與此config.py文件:

$ cat config.py 
print "Everything is ok for now" 

結果是所預期的:

+1

你可以捕獲SystemExit;不需要自定義例外 – jfs

+0

好點。我仍然認爲'atexit'是正確的路線。 –

相關問題