Python os.system的行为与原始输入()和文件.readlines()不同

Python os.system的行为与原始输入()和文件.readlines()不同,python,Python,我通过os.system运行命令,可以通过两种不同的方式获得所需的命令;从用户输入或从文件 # Code works fine with this filename = raw_input('Enter a filename:' ) # but it doesn't work if I do this: f = open("userinput.txt").readlines() filename = f[1] 如果我现在打印文件名,我会得到完全相同的输出。但是,当文件名通过os.syste

我通过os.system运行命令,可以通过两种不同的方式获得所需的命令;从用户输入或从文件

# Code works fine with this
filename = raw_input('Enter a filename:' )

# but it doesn't work if I do this:
f = open("userinput.txt").readlines()
filename = f[1] 
如果我现在打印文件名,我会得到完全相同的输出。但是,当文件名通过os.system传递时,它只在大写字母中起作用。另一个案例打印了一些我没有要求的数据。我会张贴完整的源代码,但文件是巨大的!这是一个狙击手

string = "sort -n -k3,3 -k2,2 -k1,1 < "
string1 = "> orderedfile.txt"

cmd = string + filename + string1
reordering = os.system(cmd)
string=“sort-n-k3,3-k2,2-k1,1”
string1=“>orderedfile.txt”
cmd=string+filename+string1
重新排序=操作系统(cmd)
当前行为
readlines()
返回末尾带有
\n
的行。因此,您将运行的代码拆分为两个单独的命令。假设您的文件是
unsorted_input.txt
,则将运行:

sort -n -k3,3 -k2,2 -k1,1 < unsorted_input.txt
> orderedfile.txt
首选方法(安全外壳使用)
def排序文件(输入文件名,输出文件名):
subprocess.call(
['sort-n-k3,3-k2,2-k1,1“$2”',#这是要运行的shell脚本
“35;”,当脚本运行时,它变成$0
输入_filename,#这变成$1
输出_filename],#变成$2
shell=True)

请注意,在本例中,我们从代码中传递文件名带外,并引用它们所使用的扩展。

使用字符串连接构建命令天生就有缺陷,您不应该从一开始就这样做。这就像使用相同的机制来生成SQL查询——有人给你一个包含
$(rm-rf~)
的文件名,而你只是用软管冲洗了你的帐户。也就是说,这段代码非常混乱。它指的是一个从未设置过的
sideview
变量,它定义的是
string2
,尽管它也从未使用过。它们只是没有在后面的代码段中定义这是我的观点。这里发布的代码应该是一个,其他人可以复制和粘贴以查看相同的问题。这种错误会阻止其他人复制行为,从而无法检查他们的答案。非常感谢,就这样!请参见演示最佳实践方法的编辑。当您将字符串附加到一起以形成命令时,可能会出现安全漏洞。感谢您的编辑-非常有用。我会记住这一点!
import subprocess

def sort_file(input_filename, output_filename):
    subprocess.call(['sort', '-n', '-k3,3', '-k2,2', '-k1,1'],
                    stdin=open(input_filename, 'r'),
                    stdout=open(output_filename, 'w'))

sort_file(
    open('userinput.txt', 'r').readlines()[1].rstrip('\n'),
    'output_file.txt',
)
def sort_file(input_filename, output_filename):
    subprocess.call(
        ['sort -n -k3,3 -k2,2 -k1,1 <"$1" >"$2"', # this is the shell script to run
         '_',                                     # this becomes $0 when that script runs
         input_filename,                          # this becomes $1
         output_filename],                        # this becomes $2
        shell=True)