Вы не можете модифицировать sys.stdout таким образом; sys.stdout - это просто TextIOWrapper вокруг настоящего стандартного вывода, который на самом деле является дескриптором файла 1. В результате такие вещи, как print
(или все, что записывает в файловый дескриптор 1 напрямую), будут полностью игнорировать то, что вы сделали. Чтобы добиться истинного перенаправления, вы должны сделать что-то вроде этого:
# Copy standard out to a second file descriptor for restoration
original_stdout = os.dup(sys.stdout.fileno())
# Replace standard out with /dev/null
nullfd = os.open("/dev/null", os.O_WRONLY)
os.dup2(nullfd, sys.stdout.fileno())
os.close(nullfd)
# Do your stuff here
# Restore standard out and close duplicated file descriptor
os.dup2(original_stdout, sys.stdout.fileno())
os.close(original_stdout)
Это перенаправит все стандартные данные в /dev/null, а затем восстановит их снова после того, как вы закончите. См. документацию по os.dup, os.dup2 и это сообщение на StackOverflow о перенаправлении стандартных файловых дескрипторов в C (тот же принцип применим и к Python).
Обратите внимание, что здесь вы должны использовать функции os
, а не встроенные open
. Чтобы это сработало, вы должны работать с реальными базовыми дескрипторами файлов.
Похоже, что на этот вопрос фактически был дан ответ в этом другом вопросе , но он устарел, поэтому вот текущее решение:
Это включает в себя передачу вашего локального каталога после вашего «Pass 1» в wget
, чтобы заставить его поверить, что это веб-сайт. Это легко сделать с помощью короткого кода Python, вызывающего SimpleHTTPRequestHandler , а затем вы-wget
с локального хоста с соответствующими параметрами.
Что-то в этом роде может работать :
import http.server
import socketserver
import os
PORT = 8000 # optional, can be changed
web_dir = os.path.join(os.path.dirname(path), 'web') # change path to your local files here if needed, like '/home' or 'C:\\tmp' on Windows
os.chdir(web_dir)
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()
тогда ваш wget
может быть вызван наhttp://localhost:8000