使用指定conda环境的shebang运行Python脚本时input()触发EOFError
报错成因
conda 4.9及以上版本中,conda run命令默认会捕获子进程的标准输入(stdin)、标准输出(stdout)、标准错误(stderr),不会将终端的输入流透传给执行的Python进程。当代码运行到input()尝试读取输入时,输入流为空,就会抛出EOFError。
而先激活conda环境再运行Python脚本时,Python进程直接在当前交互shell中启动,可以正常读取终端的输入流,所以不会报错。
解决方案
方案1:直接使用目标环境Python解释器的绝对路径作为shebang(最稳定)
这是兼容性最好、无额外开销的方案,操作步骤:
- 执行以下命令查询TEST环境的Python解释器绝对路径:
conda run -n TEST which python
- 将查询到的路径直接写在shebang行即可,示例(替换为你自己查询到的路径):
#!/Users/你的用户名/miniconda3/envs/TEST/bin/python def main(): # testing chromatogram_result = input() print(chromatogram_result) if __name__ == "__main__": main()
后续直接运行./my_file.py就可以正常读取输入,不需要提前激活环境。
方案2:给conda run添加透传输入输出的参数
如果不想写死绝对路径,可以给conda run添加--no-capture-output参数(conda 4.10+支持),修改shebang为:
#!/usr/bin/env conda run -n TEST --no-capture-output python
注意:部分老旧Unix系统的shebang机制不支持传递多个参数,可能会失效,你当前使用的macOS 10.14环境支持该写法。
内容的提问来源于stack exchange,提问作者user16837577
相关产品推荐
相关产品推荐

