【问题标题】:EOFError when starting with subproccess从子进程开始时出现 EOFError
【发布时间】:2019-01-26 10:51:05
【问题描述】:

当我从另一个脚本使用 subproccess 启动我的 python3 脚本时,我收到以下错误:

Select the keyword preset you want to use:Traceback (most recent call last):
  File "test2.py", line 9, in <module>
    keywordselect=input("Select the keyword preset you want to use:")
EOFError

但是当我使用 python3 generate.py 正常启动脚本时,它工作得很好,没有错误。

脚本1:

import subprocess
p = subprocess.Popen(["python3", "test2.py"])

脚本2:

print("Keyword")
print("1. Preset1")
print("2. Preset2")
print("3. Preset3")
print("4. Preset4")
print("You can edit the presets in /presets/keywords/.")
selecting = 1
while selecting == 1:
    keywordselect=input("Select the keyword preset you want to use:")
    if keywordselect == "1":
        print("You selected keyword preset 1.")
        selectedkeywordlist = "presets/keywords/preset1.txt"
    elif keywordselect == "2":
        print("You selected keyword preset 2.")
        selectedkeywordlist = "presets/keywords/preset2.txt"
    elif keywordselect == "3":
        print("You selected keyword preset 3.")
        selectedkeywordlist = "presets/keywords/preset3.txt"
    elif keywordselect == "4":
        print("You selected keyword preset 4.")
        selectedkeywordlist = "presets/keywords/preset4.txt"
    else:
        print("You didn't select a valid option, please try again.")

【问题讨论】:

  • 你可以试试p = subprocess.call(["python3", generatefile]) 吗?您应该显示您的 script1 的 minimal reproducible example
  • 您的第二个脚本期望从input("Select the keyword preset you want to use:") 上的stdin 读取,但据我所知,您没有为调用的子进程提供任何内容
  • @Jean-FrançoisFabre python3 pre-generate.py 文件“generate.py”,第 272 行 ^ 语法错误:解析时出现意外 EOF
  • @FlyingTeller 我希望用户在子进程中输入 1 2 3 或 4
  • 您之前可能重定向了标准输入。显示第一个脚本的minimal reproducible example

标签: python python-3.x subprocess eoferror


【解决方案1】:

你必须通过script2.py的调用重定向stdinstdout,可以使用subporcess.PIPE

p = subprocess.Popen(["python3", "test2.py"], stdin=subprocess.PIPE, 
                     stdout=subprocess.PIPE)

【讨论】:

    【解决方案2】:

    您正在使用subprocess.Popen,这是默认情况下的非阻塞代码段,因此您编程光标移动而不是等待用户输入。但是你需要的是一个阻止你的程序光标的代码。 subprocess.call 正是这样做的。它将等待另一个命令完全执行。

    您需要使用subprocess.call 来解决您的问题。只需使用此更改您的 script2 文件

    import subprocess
    p = subprocess.call(["python", "abca.py"])
    

    您可以在this answer 中阅读有关subprocess.Popensubprocess.call 之间区别的更多信息。其中描述了何时使用哪个命令以及它们之间的区别

    【讨论】:

    • 我的第一条评论暗示了这一点,OP 回复说它具有相同的效果。
    • 我可以复制这个问题。当我使用subprocess.call 时,它得到了解决
    • 哈哈哈。好像你犯了和我一样的错误。您试图从 IDE 执行它。现在,在从终端执行它时,它被复制了。 :P
    • 哈哈哈我的错误是试图在我的脑海中执行它。实际上,我认为 op first 脚本中的内容不止于此。看看你能不能被录取。
    • 实际的解释是:第一个脚本在另一个脚本运行时退出,破坏了输入管道。
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多