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"

但是,模块的代码仅在第一次 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"
于 2012-06-01T12:34:59.277 回答
2

使用atexit模块注册清理处理程序,或者如果您确定GetVars正在调用sys.exit,则猴子修补后者以抛出自定义异常而不是真正运行,以便您可以捕获它并手动处理它。

于 2012-06-01T12:30:03.833 回答