Используя wget или другую команду, как загрузить сейчас, а преобразовать ссылки позже?

Вы не можете модифицировать 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. Чтобы это сработало, вы должны работать с реальными базовыми дескрипторами файлов.

3
13.04.2017, 15:36
1 ответ

Похоже, что на этот вопрос фактически был дан ответ в этом другом вопросе , но он устарел, поэтому вот текущее решение:

Это включает в себя передачу вашего локального каталога после вашего «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

1
27.01.2020, 21:30

Теги

Похожие вопросы