2

私はGetVars()関数を持っています(変更されるべきではありません)、場合によってはスローsys.exit(1)されます。この場合のクリーンアップを行いたい:

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

config.pyいくつかの引数を取る必要がありますが、print今のところ唯一のステートメントが含まれています。しかし、それは実行されません - それを行う方法はありますか? 何が起こるかを理解しようとしているだけですが、コードが奇妙に見えることはわかっています:)

UPD:今、私は実行しようとしています

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"
4

2 に答える 2

4

mymodule.pyこのファイルで試しました:

$ 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"

結果は期待されるものです:

$ python mymodule.py 
Everything is ok for now

問題はインポート自体にもキャプチャにもないと確信していSystemExitます...おそらくconfig.pyファイルが壊れています。

更新:ああ、私はそれを手に入れたと思います!

新しいコードによると、configモジュールを の前にsys.exit(1)インポートし、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"
于 2012-06-01T12:34:59.277 に答える
2

atexitモジュールを使用してクリーンアップ ハンドラーを登録するか、それGetVarsが呼び出していることが確実な場合はsys.exit、実際に実行するのではなくカスタム例外をスローするように後者にモンキー パッチを適用して、それをキャッチして手動で処理できるようにします。

于 2012-06-01T12:30:03.833 に答える