我正在尝试为一个非常老的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包装器。本质上,我需要运行该程序并将这样的文件直接从文件直接输入到程序中(从命令行)。 ...
您需要编写不带列表的整个命令:
或者作为@LinPy答案,您可以将标准输入作为参数传递给call()
: