- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Python 辅助函数来并行运行 grunt 命令,使用 Popen
来处理子进程。目的是通过 CLI 进行通信。当所有这些过程需要任何用户输入时,问题就开始了,例如文件路径、密码、“是/否”决定:
Enter file path: Enter file path: Enter file path: Enter file path: Enter file path: Enter file path: Enter file path:
Everything up-to-date
Grunt task completed successfully.
用户提供一次输入,一个进程成功完成,所有其他进程永远不会完成执行。
代码:
from subprocess import check_output, Popen
def run_grunt_parallel(grunt_commands):
return_code = 0
commands = []
for command in grunt_commands:
with tempfile.NamedTemporaryFile(delete=False) as f:
app = get_grunt_application_name(' '.join(command))
commands.append({'app': app, 'process': Popen(command, stdout=f)})
while len(commands):
sleep(5)
next_round = []
for command in commands:
rc = command['process'].poll()
if rc == None:
next_round.append(command)
else:
if rc == 0:
else:
return_code = rc
commands = next_round
return return_code
有没有办法确保用户可以为每个流程提供所有必要的输入?
最佳答案
您想要的几乎(如果不是完全)不可能。但是,如果您能够以无前缀的方式识别提示(并且,如果它有所不同,从中知道他们期望输入多少行),您应该能够管理它。
使用双向无缓冲管道运行每个进程:
Popen(command, stdin=subprocess.PIPE,
stdout=f, stderr=subprocess.PIPE, bufsize=0)
(行为良好的程序会提示标准错误。您的程序似乎会这样做,因为尽管有 stdout=f
,您还是显示了提示;如果它们不可靠,您可以阅读同样来自管道,在其中搜索提示,然后自己将其复制到文件中。)
将所有管道设置为非阻塞。然后使用 select
监控所有进程的 stderr
管道。 (您可以尝试使用 selectors
。)缓冲您为每个进程分别读取的内容,直到您识别出来自一个进程的提示。然后显示提示(标识源进程)并接受来自用户的输入——如果提示之间的输出适合管道缓冲区,这不会减慢后台工作。将该用户输入放入与该进程关联的缓冲区中,并将其 stdin
管道添加到 select
。
当 stdin
管道显示准备就绪时,写入它,并在完成后将其从集合中移除。当从管道读取返回 EOF 时,加入
相应的进程(或者如果您担心进程可能提前结束,则在 SIGCHLD
处理程序中这样做)。
除非你有一个支持管道的可用的select
仿真,否则你将不得不使用线程——每个进程一个,或者如果一个进程可能在编写提示后产生输出,则每个管道一个在阅读回复之前。然后使用 Queue
将提示作为消息发送到主线程,然后主线程可以使用(例如)另一个每进程 Queue
将用户输入发送回线程(或其写作伙伴)。
这适用于任何支持线程
的平台,并且具有不依赖管道缓冲区以避免拖延多话进程的潜在优势。
关于python - 如何处理在 Python 中并行运行的子进程的用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49857892/
在为 Web 应用程序用例图建模时,为用户可以拥有的每个角色创建一个角色是否更好?或拥有一个角色、用户和一个具有特权的矩阵? guest < 用户 < 版主 < 管理员 1: guest 、用户、版主
我无法使用 Elixir 连接到 Postgres: ** (Mix) The database for PhoenixChat.Repo couldn't be created: FATAL 28P
这个问题已经有答案了: Group by field name in Java (7 个回答) 已关闭 7 年前。 我必须编写一个需要 List 的方法并返回 Map> . User包含 Person
感谢您的帮助,首先我将显示代码: $dotaz = "Select * from customers JOIN contracts where customers.user_id ='".$_SESS
我只想向所有用户中的一个用户显示一个按钮。我尝试了 orderByKey() 但没有成功! 用户模型有 id 成员,我尝试使用 orderByChild("id") 但结果相同! 我什至尝试了以下技巧
我们在工作中从 MongoDB 切换到 Postgres,我正在建立一个 BDR 组。 在这一步,我正在考虑安全性并尽可能锁定。因此,我希望设置一个 replication 用户(角色)并让 BDR
export class UserListComponent implements OnInit{ users; constructor(private userService: UserS
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
在 LinkedIn 中创建新应用程序时,我得到 4 个单独的代码: API key 秘钥 OAuth 用户 token OAuth 用户密码 我在 OAuth 流程中使用前两个。 的目的是什么?最后
所以..我几乎解决了所有问题。但现在我要处理另一个问题。我使用了这个连接字符串: SqlConnection con = new SqlConnection(@"Data Source=.\SQLEX
我有一组“用户”和一组“订单”。我想列出每个 user_id 的所有 order_id。 var users = { 0: { user_id: 111, us
我已经为我的Django应用创建了一个用户模型 class User(Model): """ The Authentication model. This contains the u
我被这个问题困住了,找不到解决方案。寻找一些方向。我正在用 laravel 开发一个新的项目,目前正致力于用户认证。我正在使用 Laravels 5.8 身份验证模块。 对密码恢复 View 做了一些
安装后我正在使用ansible配置几台计算机。 为此,我在机器上本地运行 ansible。安装中的“主要”用户通常具有不同的名称。我想将该用户用于诸如 become_user 之类的变量. “主要”用
我正在尝试制作一个运行 syncdb 的批处理文件来创建一个数据库文件,然后使用用户名“admin”和密码“admin”创建一个 super 用户。 到目前为止我的代码: python manage.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我已在 Azure 数据库服务器上设置异地复制。 服务器上运行的数据库之一具有我通过 SSMS 创建的登录名和用户: https://learn.microsoft.com/en-us/azure/s
我有一个 ionic 2 应用程序,正在使用 native FB Login 来检索名称/图片并将其保存到 NativeStorage。流程是我打开WelcomePage、登录并保存数据。从那里,na
这是我的用户身份验证方法: def user_login(request): if request.method == 'POST': username = request.P
我试图获取来自特定用户的所有推文,但是当我迭代在模板中抛出推文时,我得到“User”对象不可迭代 观看次数 tweets = User.objects.get(username__iexact='us
我是一名优秀的程序员,十分优秀!