在Python中,如何在另一个py文件的[if uuuu name_uuuu=='.\uuuuuuu main_uuu']内调用子例程?

在Python中,如何在另一个py文件的[if uuuu name_uuuu=='.\uuuuuuu main_uuu']内调用子例程?,python,main,python-module,Python,Main,Python Module,假设我在python控制台中,并且希望在同一进程中启动另一个python程序。python程序如下所示: import sys if __name__ == '__main__': args = sys.argv for key in args: print(key) 我不允许修改它 这样做的正确方式是什么?我可以称它为“main函数”,它有不同的参数列表,比如C++还是java? 我不反对被认为是黑客的方法。Python是一种高度可扩展的解释语言

假设我在python控制台中,并且希望在同一进程中启动另一个python程序。python程序如下所示:

import sys

if __name__ == '__main__':
      args = sys.argv
      for key in args:
          print(key)
我不允许修改它

这样做的正确方式是什么?我可以称它为“main函数”,它有不同的参数列表,比如C++还是java?
我不反对被认为是黑客的方法。Python是一种高度可扩展的解释语言,我将尽一切必要绕过此限制

您可以读取该文件并使用exec使用当前全局变量执行代码,以便uuuu name_uuu=='\uu main_uu'为真

exec(open('file.py').read(), globals())

您不能调用它的主函数,因为它没有主函数

事实上,通常的处理方法是将所有这些代码移到一个函数中,然后让_umain _; guard代码调用:

def main(args):
    for key in args:
        print(key)

if __name__ == '__main__':
    main(sys.argv)
然后您可以调用它的主函数,向它传递您想要的任何参数

但是如果你不能修复文件,那就行不通了

那么,你能做什么?这完全取决于您需要如何准确地遵循通常的python other.py语义

快速肮脏的方法是按照建议执行:读取文件,然后使用您自己的脚本中的:

with open('another.py') as f:
    exec(f.read(), globals())
请注意,这将使sys.argv保持不变。当然,您可以先手动将其设置为其他值:

_argv = sys.argv
sys.argv = ['args', 'i', 'want', 'it', 'to', 'see']
try:
    with open('another.py') as f:
        exec(f.read(), globals())
finally:
    sys.argv = _argv
如果您是从另一个模块(而不是从顶级脚本)执行此操作,则此操作将不起作用,但稍加修改,它将:

with open('another.py') as f:
    exec(f.read(), sys.modules['__main__'].__dict__)
但是您最好创建一个干净的全局名称空间。该脚本可能不希望您的全局文件出现,它可能会更改您不希望更改的内容。这同样简单:

with open('another.py') as f:
    exec(f.read(), {})
请注意,这仍然会自动继承您通常需要的当前值。如果您出于某种原因不想这样做,请参阅exec文档

如果您想保证执行脚本的方式与正常运行脚本的方式完全相同,请使用模块

当您运行python-m Other时,它最终要做的是:

runpy.run_module(sys.argv[0], run_name="__main__", alter_sys=True)
因此,您可以手动执行相同的操作:

runpy.run_module('another', run_name='__main__')
您是否要添加alter_sys=True取决于您的目标。没有它,如果脚本尝试像脚本或sys.modules[''u_____']那样访问sys.argv,它将看到您的值,而不是自己的值


如果要模拟python other.py,您需要使用创建完整的_spec_______)和相关对象,然后调用runpy.run_path。

为了澄清问题,您根本不允许接触python文件吗?听起来像是某个CTF问题。将其作为脚本运行,因为它是要运行的。@pkqxdd,不,我不能,具体来说,原始的不可接触文件是mavproxy.py。这绝对不是CTF问题,非常感谢!非常全面,完全符合我的要求。