使用向python脚本传递参数时发生执行错误操作系统. 剧本需要系统argv论据

2024-03-28 14:21:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试从cmd执行一个简单的python命令,比如C:\Users> stat.py < swagger.yaml > output.html,它执行统计数据通过采取招摇过市.yaml作为输入参数并生成输出.html它在cmd中运行良好。但现在我要执行我的命令统计数据通过另一个python文件演示.py通过传递值招摇过市.yaml以及输出.html作为系统argv[0]和系统argv[1] 内部演示.py. 你知道吗

来自cmdC:\Users> demo.py swagger.yaml output.html的我的命令和我的演示.py文件如下。。你知道吗

 # my demo.py file ....

import os
import sys

os.system('stat.py < sys.argv[1] > sys.argv[2]')

错误-系统找不到指定的文件。
为什么我得到这个错误,请任何帮助解决它。。你知道吗


Tags: 文件py命令cmdyamloutputdemo系统
1条回答
网友
1楼 · 发布于 2024-03-28 14:21:08

在普通字符串中,不应用变量解释。因此,您实际上要求从名为sys.argv[1]的文件(如果该文件存在,可能是sys.argv1,这要感谢shell globbing),读取并写入名为sys.argv[2]的文件。你知道吗

如果要在脚本中使用值sys.argv,则需要将它们格式化为字符串,例如使用f-strings(仅限现代Python 3.6或更高版本):

os.system(f'stat.py < {sys.argv[1]} > {sys.argv[2]}')  # Note f at beginning of literal

或者在旧版Python2.7上,使用str.format

os.system('stat.py < {} > {}'.format(sys.argv[1], sys.argv[2]))

请注意,无论您如何分割它,这都是危险的;os.system在shell中启动它,并且包含shell元字符的参数将被解释为这样。它不能做用户没有权限做的任何事情,但是用户的小错误可以极大地改变程序的行为。如果要正确/安全地执行此操作,请使用subprocess,自己打开文件,并以stdin/stdout的形式显式传递它们:

with open(sys.argv[1], 'rb') as infile, open(sys.argv[2], 'wb') as outfile:
    subprocess.run(['stat.py'], stdin=infile, stdout=outfile)

这样可以确保在启动进程之前首先打开文件,不允许shell解释任何内容,并且完全避免了启动shell的(小)开销。如果打开文件失败,它还会给您带来更多有用的错误。你知道吗

相关问题 更多 >