簡體   English   中英

os.system的行為與raw_input()和file.readlines()的輸入不同

[英]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',
)

首選方法(安全使用Shell)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM