使用命令行参数在另一个 Python 脚本中调用一个 Python 脚本
Posted
技术标签:
【中文标题】使用命令行参数在另一个 Python 脚本中调用一个 Python 脚本【英文标题】:Calling one Python script inside another with command-line arguments 【发布时间】:2022-01-18 03:37:15 【问题描述】:我有两个独立的 Python 脚本,它们通过提供相关参数独立工作。现在我需要在python2.py
中调用python1.py
,并传递python1.py
接受的相关参数。
这是正确的方法吗?
-
在
python2.py
内创建一个方法call_python1(args)
使用子进程模块执行python1.py
在python2.py
的main方法中调用call_python1
注意:两个脚本应该像现在一样保持独立工作。
【问题讨论】:
您使用subprocess
运行python 脚本,就像执行任何其他shell 命令一样。所以总体思路是对的。为什么这甚至值得怀疑?
你试过了吗?编写代码然后提出问题可能会更快。
这个假设的call_python1.py
函数将如何实现?
方法名错误,已更新
@viki 这是,如果您可以控制python脚本,因为您可以选择调整脚本(如果需要)并使其可作为模块导入,这样您就不必跨越流程边界。否则,程序编写的语言是无关紧要的。
【参考方案1】:
在所描述的情况下,这是正确的方法:两个脚本应该继续作为独立的命令行工具工作。 (如果没有,建议将import
作为一个模块。)
在这种情况下,通常需要确保另一个脚本由同一个 Python 解释器执行,以防安装了多个不同的版本。所以在python2.py
中,也可能在call_python1
函数中,你可以像这样启动子进程:
import subprocess
import sys
subprocess.run([sys.executable, 'python1.py', ...])
这里sys.executable
给出了“[当前] Python 解释器的可执行二进制文件的绝对路径”。省略号表示要传递的附加命令行参数,作为单独的字符串添加到列表中。
【讨论】:
感谢您的宝贵帖子。如果我理解正确,将 python1.py 作为模块导入,在这种情况下,它不能用作独立的命令行脚本? 不,可以。但是你必须以不同的方式传递论点。所以这给代码增加了一些复杂性。这可能是有根据的。这基本上取决于您是否将 Python 模块视为独立脚本,或者它是否是提供某些功能的库。如果编码正确,它也可以是这两件事。 我尝试了以下但仍然失败并出现错误“FileNotFoundError: [Errno 2] No such file or directory” 场景 - 我想在 python2.py 中运行脚本 python1.py 在 python2.py 中我定义了一个方法 def call_script1(a, b, c, d): 这是我尝试并失败并出现上述错误的代码(找不到文件)我尝试了以下但仍然失败并出现错误“FileNotFoundError:[Errno 2]没有这样的文件或目录”场景 - I想在 python2.py 里面运行脚本 python1.py 在 python2.py 里面我定义了一个方法 def call_script1(a, b, c, d): args = " -programArgs=' " + a+ " " +b+" "+c+ " " +d+" ' " script_location = /root/dir/python1.py script_launch = script_location + args subprocess.run([script_launch])【参考方案2】:您当然可以使用子进程调用 python1.py,但我会避免这种调用,因为您需要管理子进程生命周期(操作系统权限,检查子进程的状态代码,最终进程的状态,等等)。
我的建议是将 python1 转换为可导入包(请参阅the official python documentation 了解更多信息)。
通过这样做,您将获得一组好处:明确定义的需求、版本等。它最终将被不想使用子进程的 python 代码重用。
【讨论】:
谢谢,您知道可导入包是否仍将继续用作独立的命令行脚本吗? 您可以通过运行一个子模块 python 来导入脚本并执行代码来使用它,在这种情况下您可以考虑创建一个 CLI 实用程序 使用 subprocess.run 对我没有任何帮助。不确定是因为服务器上的某些安全性还是其他问题。现在我将导入其他 python 脚本作为模块并在主脚本中使用相关方法。谢谢以上是关于使用命令行参数在另一个 Python 脚本中调用一个 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章