python - os.system 在 raw_input() 和 file.readlines() 中的输入表现不同

标签 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.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 截断为空。

最小的可能修复只是从文件名中删除尾部换行符 - 但这会让您面临许多其他错误:带有空格的文件名、带有文字引号的文件名、带有命令替换的文件名或其组合将抛出原始文件陷入困惑。

<小时/>

首选方法(不需要 shell)

正确的实现看起来更像是:

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)

请注意,在这种情况下,我们从代码带外传递文件名,并在使用它们的地方引用扩展。

关于python - os.system 在 raw_input() 和 file.readlines() 中的输入表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45716845/

相关文章:

python - Ubuntu Buildozer JAVA_HOME 设置为无效目录

python - 如何同时处理 ipv4 和 ipv6 客户端请求

python - 您可以获得 Google Cloud Composer/Airflow 的静态外部 IP 地址吗?

python - Azure 数据湖的 Azure 函数绑定(bind) (python)

python - 如何将多个数组写入一个excel文件中?

python - python是否在同一行中缓存项目并稍后再次使用

python - selenium.common.exceptions.InvalidSelectorException : Message: An invalid or illegal selector was specified

python - 将参数传递给基类构造函数或使用实例变量?

python - flask:跨 View 函数传递参数

python - 使用numpy将两个数组垂直合并为元组数组