在我的python文件中,我制作了一个GUI小部件,它接受用户的一些输入。我在我的python文件中导入了一个python模块,该模块使用raw_input()接受一些输入。我必须按原样使用这个模块,我没有权利更改它。当我运行我的python文件时,它要求我输入(由于导入模块的raw_input() )。我想在那个地方使用GUI小部件输入。如何将用户输入(从小部件中获取)作为导入模块的raw_input()传递?
发布于 2013-07-17 08:38:29
首先,如果将它直接import到脚本中实际上不是必需的(很难想象为什么会这样),那么可以使用subprocess或pexpect将模块(或包装在它周围的简单脚本)作为单独的进程运行。
让我们将其具体化。假设您想要使用这个愚蠢的模块foo.py
def bar():
x = raw_input("Gimme a string")
y = raw_input("Gimme another")
return 'Got two strings: {}, {}'.format(x, y)首先编写一个简单的foo.wrapper.py
import foo
print(foo.bar())现在,不要在实际脚本中直接调用foo.do_thing(),而是将foo_wrapper作为子进程运行。
我将假设您已经有了想要以字符串形式发送的输入,因为这使得答案中不相关的部分变得更简单(实际上,它使它们成为可能-如果您想使用一些GUI代码来实现这一点,除非您首先告诉我们您正在使用哪个GUI库,否则我无法向您展示如何做到这一点)。
所以:
foo_input = 'String 1\nString 2\n'
with subprocess.Popen([sys.executable, 'foo_wrapper.py'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE) as p:
foo_output, _ = p.communicate(foo_input)当然,在现实生活中,您会希望为foo_wrapper.py使用适当的路径,而不是假设它在当前工作目录中,但这应该足以说明这一想法。
同时,如果“我没有权利改变它”仅仅意味着“我没有(也不应该)签入foo项目的github站点或我们公司的P4服务器上的相关子树的权限”或者其他什么,那么有一个非常简单的答案: fork,然后改变Fork。
即使它拥有像LGPL这样的弱版权许可: fork它,更改fork,在与原始许可相同的许可下发布您的fork,然后使用您的fork。
如果您依赖于每个目标系统上都安装的foo包,而不能依赖于您的替换foo包,那么问题就更大了。但是,如果实际调用raw_input的函数或方法只是foo中实际代码的一小部分,您可以通过在运行时对foo进行临时匹配来解决这个问题。
这导致了最后的可能性:你可以随时修改raw_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这意味着调用raw_input的foo中的任何代码都将看到您塞进其模块全局变量中的函数,而不是普通的内置函数。除非它做了一些非常奇特的事情(比如直接查找内建并将其复制到局部变量或其他地方),否则这就是答案。
如果你需要处理那些非常时髦的边缘情况,并且你不介意做一些有问题的事情,你可以这样做:
import __builtin__
__builtin__.raw_input = fake_raw_input您必须在出现问题的任何地方的第一个import foo之前执行此操作。此外,还不清楚这是故意保证工作的,还是意外保证工作的(并且应该在未来修复),还是不保证工作。但它确实可以工作(至少对于CPython 2.5-2.7,这是您可能正在使用的)。
https://stackoverflow.com/questions/17687910
复制相似问题