使用subprocess.call中文件的输入,而os.system则不起作用

问题描述 投票:2回答:2

我正在尝试为一个非常老的FORTRAN程序创建一个python3包装器。本质上,我需要运行该程序并将这样的文件直接从文件直接输入到程序中(从命令行)。

programname < input.txt

这毫无问题。当我尝试在python中执行此操作时,os.system可以工作,但subprocess.call却不能。当我使用subprocess.call时,我被卡住了,程序就坐在那里等待输入,即使它应该已经输入了。

为什么不只使用os.system?我需要执行时间限制。有时,FORTRAN代码在内部卡住,只能停留在那儿。如果5秒钟内未完成,则需要将其杀死。据我了解,os.system无法强制执行限制,但是subprocess.call可以执行限制,所以这就是我所追求的。

我已经使用python程序作为FORTRAN程序的替代品重新创建了它。这是此代码(pythonInput.py):

some_input = input("Enter some input: ") 
print(some_input)

然后创建一个包含任何内容的输入文件,这就是我所使用的(input.txt)

RealName

从命令行可以正常工作:

python pythonInput.py < input.txt

返回:

[khoopes@computer ~]$ python pythonInput.py < input.txt
Enter some input: RealName
[khoopes@computer ~]$

但是当我创建另一个使用python来调用另一个python程序的脚本时,它的subprocess.call不起作用,这是该代码(pythonRunTester.py):

import subprocess
import os
os.system('python pythonInput.py < input.txt')
subprocess.call(['python', 'pythonInput.py', '<', 'input.txt'])

返回:

[khoopes@computer ~]$ python pythonRunTester.py
Enter some input: RealName
Enter some input:

操作系统正常运行,但是subprocess.call无效,它只是挂在那里等待。我尝试过使用shell = True标志,如下所示:

import subprocess
import os
os.system('python pythonInput.py < input.txt')
subprocess.call(['python', 'pythonInput.py', '<', 'input.txt'], shell=True)

返回]

[khoopes@computer ~]$ python pythonRunTester.py
Enter some input: RealName
Python 3.6.8 (default, Aug  7 2019, 17:28:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

但是那也不起作用。

关于如何使用subprocess.call或其他方式,我可以使用os.system强制执行时间的任何想法?

谢谢,

我正在尝试为一个非常老的FORTRAN程序创建一个python3包装器。本质上,我需要运行该程序并将这样的文件直接从文件直接输入到程序中(从命令行)。 ...

python subprocess
2个回答
1
投票

您需要编写不带列表的整个命令:


0
投票

或者作为@LinPy答案,您可以将标准输入作为参数传递给call()

© www.soinside.com 2019 - 2024. All rights reserved.