我用这个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"
但是,模块的代码仅在第一次 import 时执行。下面的要么将模块放在命名空间中,要么,如果它已经在命名空间中,则什么都不做。
在我看来,最好的解决方案是在模块中定义一个函数。如果这是您的模块的内容:
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 中处理代码的最佳方式:将代码放入函数中,将函数放入模块中,然后调用函数。正如您尝试做的那样,将可执行代码直接放在模块中通常不是一个好习惯。
第二次更新:如果您无法更改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"