我有一个 python3 脚本,如下所示:
...
def main():
parser = argparse.ArgumentParser(description='Perform normalisation checks on pass2 files')
parser.add_argument('-p', '--parser', action='store', help='parser_code.', default="")
parser.add_argument('-m', '--midnight', help='start of day '
'in ns UTC', type=int, default=0)
parser.add_argument('file', help='File to validate')
args = parser.parse_args()
rc = ReturnCode.SUCCESS
rc = do_checks(args.file, args.midnight, args.parser)
print(f"Validation completed with status: {rc}")
exit(rc)
if __name__ == '__main__':
main()
通常我会在命令行上运行此脚本,传入文件名作为参数,所以类似于:
python3 /util/check_normalisation.py -p lse /home/pchong/work/algotick/new_lob/pass2/01/97756_20240701.h5
但是,现在我有一个充满文件的目录(数千个文件),我想对其运行此脚本。
并且我发现从我创建的另一个脚本“运行此脚本”具有挑战性。是否有可能做到这一点? 这是我的脚本的概要:
directory = '<path_to_directory_with_files_I_would_like_to_run_script_against'
for file in os.listdir(directory):
filename = os.fsdecode(file)
run_the_above_script(filename) # this is where I don't know what to do to run the command line python script
当然可以!在 Python 中,你可以使用
subprocess
模块来运行其他脚本,就像在命令行中一样。
以下是如何修改你的代码来实现这一点:
import os
import subprocess
directory = '<path_to_directory_with_files_I_would_like_to_run_script_against>'
script_path = '/util/check_normalisation.py' # 将其替换为你的脚本的实际路径
for file in os.listdir(directory):
filename = os.fsdecode(file)
full_path = os.path.join(directory, filename)
# 构建要运行的命令
command = [
'python3',
script_path,
'-p', 'lse', # 如果需要,添加其他参数
full_path
]
# 使用 subprocess 运行命令
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 处理输出 (可选)
print(f"File: {filename}")
print(f"Return code: {result.returncode}")
if result.stdout:
print(f"Standard output:\n{result.stdout.decode()}")
if result.stderr:
print(f"Standard error:\n{result.stderr.decode()}")
解释:
-
导入
subprocess
: 我们需要这个模块来运行外部命令。 -
定义
script_path
: 这应该是你的check_normalisation.py
脚本的完整路径。 - 构建命令列表 : 我们创建一个列表,其中包含要运行的命令以及所有必要的参数,就像在命令行中输入一样。
-
使用
subprocess.run
运行命令 : -
command
是我们之前创建的命令列表。 -
stdout=subprocess.PIPE
和stderr=subprocess.PIPE
将标准输出和错误分别捕获到变量中,以便我们以后可以处理它们。 - 处理输出 :
-
result.returncode
包含被调用脚本的退出代码。 -
result.stdout
和result.stderr
包含被调用脚本的标准输出和错误信息。你可以根据需要打印或处理它们。
其他选项:
-
如果你只需要被调用脚本的退出代码,可以使用
subprocess.call()
。 -
如果你需要与被调用脚本进行更复杂的交互(例如,实时读取输出),可以使用
subprocess.Popen()
。
希望这可以帮助你!
标签:python From: 78800751