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"