让Python在我的脚本之前运行几行

2022-03-31 00:00:00 python python-import

问题描述

我需要运行脚本foo.py,但我还需要在foo.py中的代码之前插入一些要运行的调试行。目前,我只是将这些行放在foo.py中,我很小心地不将其提交给Git,但我不喜欢这个解决方案。

我想要的是一个单独的文件bar.py,我不提交给Git。然后我想运行:

python /somewhere/bar.py /somewhere_else/foo.py
我希望这样做的是首先在bar.py中运行一些代码行,然后以__main__的身份运行foo.py。应该与bar.py行进入的进程相同,否则调试行将无济于事。

是否有方法使bar.py执行此操作?

有人建议:

import imp
import sys

# Debugging code here

fp, pathname, description = imp.find_module(sys.argv[1])
imp.load_module('__main__', fp, pathname, description)

问题在于,因为它使用导入机制,所以我需要与foo.py位于同一个文件夹中才能运行它。我不想这样。我只想输入foo.py的完整路径。

另外:该解决方案还需要使用.pyc文件。


解决方案

有一种在启动时运行代码的机制;site模块。

"This module is automatically imported during initialization."
在导入__main__之前,站点模块将尝试导入名为sitecustomize的模块。 如果您的环境要求,它还将尝试导入名为usercustomize的模块。

例如,您可以在包含以下内容的Site-Packages文件夹中放置一个Sitecustomize.py文件:

import imp

import os

if 'MY_STARTUP_FILE' in os.environ:
    try:
        file_path = os.environ['MY_STARTUP_FILE']
        folder, file_name = os.path.split(file_path)
        module_name, _ = os.path.splitext(file_name)
        fp, pathname, description = imp.find_module(module_name, [folder])
    except Exception as e:
        # Broad exception handling since sitecustomize exceptions are ignored
        print "There was a problem finding startup file", file_path
        print repr(e)
        exit()

    try:
        imp.load_module(module_name, fp, pathname, description)
    except Exception as e:
        print "There was a problem loading startup file: ", file_path
        print repr(e)
        exit()
    finally:
        # "the caller is responsible for closing the file argument" from imp docs
        if fp:
            fp.close()

然后您可以像这样运行脚本:

MY_STARTUP_FILE=/somewhere/bar.py python /somewhere_else/foo.py
  • 您可以运行foo.py之前的任何脚本,而无需添加代码重新导入__main__
  • 运行export MY_STARTUP_FILE=/somewhere/bar.py,无需每次引用

相关文章