[英]os.system behaves differently w/ input from raw_input() vs file.readlines()
我正在通過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)
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)
請注意,在這種情況下,我們將文件名從代碼中帶外傳遞,並引用使用它們的擴展名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.