从python文件中输入控制台输入

从python文件中输入控制台输入,python,Python,在我的python文件中,我制作了一个GUI小部件,它从用户那里获取一些输入。我在python文件中导入了一个python模块,该模块使用raw_input()接受一些输入。我必须使用这个模块,因为它是,我没有权利改变它。当我运行python文件时,它会要求我输入(由于导入模块的raw_input())。我想在那个地方使用GUI小部件输入。 如何将用户输入(我们从widget获取)作为导入模块的原始输入()传递?首先,如果将其直接导入脚本实际上不是一项要求(很难想象为什么会是这样),您可以将模块

在我的python文件中,我制作了一个GUI小部件,它从用户那里获取一些输入。我在python文件中导入了一个python模块,该模块使用raw_input()接受一些输入。我必须使用这个模块,因为它是,我没有权利改变它。当我运行python文件时,它会要求我输入(由于导入模块的raw_input())。我想在那个地方使用GUI小部件输入。
如何将用户输入(我们从widget获取)作为导入模块的原始输入()传递?

首先,如果将其直接导入脚本实际上不是一项要求(很难想象为什么会是这样),您可以将模块(或围绕模块的简单脚本)作为单独的进程运行,使用
子流程
pexpect

让我们把它变成混凝土。假设您想使用这个愚蠢的模块
foo.py

def bar():
    x = raw_input("Gimme a string")
    y = raw_input("Gimme another")
    return 'Got two strings: {}, {}'.format(x, y)
import foo
print(foo.bar())
首先编写一个简单的
foo.wrapper.py

def bar():
    x = raw_input("Gimme a string")
    y = raw_input("Gimme another")
    return 'Got two strings: {}, {}'.format(x, y)
import foo
print(foo.bar())
现在,不要在实际脚本中直接调用
foo.do\u thing()
,而是作为子进程运行
foo\u wrapper

我假设您已经有了要以字符串形式发送的输入,因为这使得答案中不相关的部分变得更简单(事实上,如果您想使用一些GUI代码来实现这一点,我真的无法向您演示如何进行,除非您先告诉我们您正在使用哪个GUI库)

因此:

当然,在现实生活中,您需要为
foo_wrapper.py
使用适当的路径,而不是假设它位于当前工作目录中,但这应该足以说明这一想法


同时,如果“我无权更改它”只是指“我没有(也不应该)对foo项目的github站点或我们公司P4服务器上的相关子树的签入权限”或其他什么,那么有一个非常简单的答案:Fork it,并更改Fork

即使它有像LGPL一样的弱copyleft许可证:fork it,更改fork,在与原始许可证相同的许可证下发布您的fork,然后使用您的fork

如果您依赖于每个目标系统上安装的foo包,而不能依赖于安装替换的foo,那么问题就更大了。但是,如果实际调用
raw\u input
的函数或方法只是
foo
中实际代码的一小部分,您可以在运行时通过monkeypatching
foo
来修复这一问题


这就导致了最后的可能性:你总是可以使用monkeypatch
raw\u input
本身

再一次,我要假设你已经有了使事情更简单的输入

因此,首先编写一个替换函数:

foo_input = ['String 1\n', 'String 2\n']
def fake_raw_input(prompt):
    global foo_input
    return foo_input.pop()
现在,有两种方法可以修补此问题。通常,您希望执行以下操作:

import foo
foo.raw_input = fake_raw_input
这意味着
foo
中调用
raw\u input
的任何代码都将看到您塞进其模块全局的函数,而不是普通的内置函数。除非它做了一些非常有趣的事情(比如直接查找内置项并将其复制到局部变量或其他东西),否则这就是答案

如果您需要处理一个非常时髦的边缘案例,并且您不介意做一些有问题的事情,您可以这样做:

import __builtin__
__builtin__.raw_input = fake_raw_input

您必须在第一次导入问题中的任何位置的foo之前执行此操作。此外,还不清楚这是故意保证工作,还是意外保证工作(将来应该修复),还是不保证工作。但它确实有效(至少对于您可能正在使用的CPython 2.5-2.7而言)。

我仍然不知道如何使用子流程。@user2460869:StackOverflow不是一个要求教程的好地方。如果您的问题只是“我知道我应该使用
子流程
,但必须有人教我如何使用它”,那么对于本网站来说,这不是一个合适的问题。另一方面,如果您的评论是问“在这里,
子流程
如何帮助我?”这是完全合理的。