我正在通过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]
如果我现在打印文件名,我会得到完全相同的输出。但是当filename通过os.system传递时,它只适用于大写。另一个案例打印了一些我没有要求的数据。我会发布完整的源代码,但文件很大!这是一个snippit。
string = "sort -n -k3,3 -k2,2 -k1,1 < "
string1 = "> orderedfile.txt"
cmd = string + filename + string1
reordering = os.system(cmd)
答案 0 :(得分:2)
readlines()
会在其末尾返回\n
行。因此,您将运行的代码拆分为两个单独的命令。假设您的文件为unsorted_input.txt
,则会运行:
sort -n -k3,3 -k2,2 -k1,1 < unsorted_input.txt
> orderedfile.txt
...因此,它将sort
的输出写入stdout,并将orderedfile.txt
截断为空。
最小的修复只是修剪文件名中的尾随换行符 - 但这会让你对许多其他错误开放:带空格的文件名,带文字引号的文件名,带命令替换的文件名或其组合将抛出原始文件陷入混乱。
正确的实现看起来更像是:
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)
请注意,在这种情况下,我们会从代码中传递文件名带外,并引用它们使用的扩展名。