python - prevent IOError: [Errno 5] Input/output error when running without stdout

后端 未结 1 550
执念已碎
执念已碎 2021-01-02 02:20

I have a script that runs automatically on server through cronjob and it import and run several other scripts.

Some of them use prints, which naturally creates

相关标签:
1条回答
  • 2021-01-02 03:09

    Modifying the builtin or changing sys.stdout should work (except for subprocesses—but you ruled those out) as long as you do it early enough. If not, though, there's a lower level trick that's much easier:

    • run your python scripts with I/O redirection that discards output:

      python foo.py >/dev/null 2>&1
      

      (assuming Unix-y scripts, as implied by "cron" in the question)

    • or, redirect file descriptors 1 and 2 (same idea as above, but done within your Python startup rather than as part of the cron-invoked command):

      import os
      fd = os.open(os.devnull, os.O_RDWR)
      # NB: even if stdin is closed, fd >= 0
      os.dup2(fd, 1)
      os.dup2(fd, 2)
      if fd > 2:
          os.close(fd)
      

      (this particular bit of code has the side effect of making /dev/null act as stdin, if all descriptors were closed). [Edit: I started with with open(...) and then switched to os.open and did not test the final version. Fixed now.]

    All that said, a good cron really should have stdout and stderr connected somewhere, and should email the output/error-output to you. Not all cron versions are this nice though.

    0 讨论(0)
提交回复
热议问题