私がしたいことは理想的には、このbashパイプラインをPythonで複製することです(私は実際にはpandas
を使ってこのようにしたいと思っています) :Pythonのftplibからブロックせずにパイプする
curl ftp://hgdownload.cse.ucsc.edu/goldenPath/hg38/database/refFlat.txt.gz | gunzip | cut -f 1,2,4
私は、全体のダウンロードのために、しかしftp.retrbinary()
コール・ブロック、および待機を同じ目標
# Download the zip file into memory
file = io.BytesIO()
ftp = ftplib.FTP('hgdownload.cse.ucsc.edu')
ftp.retrbinary(f'RETR goldenPath/{args.reference}/database/refFlat.txt.gz', file.write)
# Unzip the gzip file
table = gzip.GzipFile(fileobj=file)
# Read into pandas
df = pd.read_csv(table)
を達成する、Pythonで次のコードを書くことができます。私が望むのは、FTPファイルをソースとして使用し、gunzip
をフィルタとして使用し、シンクとしてpd.read_csv()
を使用して、すべてのデータを同時に処理する、長いバイナリストリームをbashパイプラインで使用することです。 retrbinary()
がブロックされないようにする方法はありますか?
私はこれが不可能かもしれないことに気付きました。なぜなら、Pythonは複数のスレッドを使うことができないからです。これは本当ですか?もしそうなら、私は
編集この同時パイプラインを実現するためにmultiprocessing
またはasync
またはいくつかの他の言語機能を使用することができます:retrbinary
にstorbinary
を変更し、これはタイプミスだったとの問題は、まだあなたのことができるようにする必要があり
Pythonは完全に複数のスレッドを使用できます。あなたは違うGILを考えています。 –