0

Python 3 ファイルがあります。インターネット上のオープンソース ツール (nltk) を使用したいのですが、残念ながら Python 2 しかサポートしていません。Python 3 に変換する方法がなく、Python 3 ファイルを Python 2 に変換することもできません。

ユーザーが (argparse で) 特定の引数を与えない場合、ファイルで何かを行います。ただし、ユーザーが特定の引数を与える場合は、nltk を使用する必要があります。

nltk を使用する Python 2 スクリプトを作成し、Python 3 スクリプトでそのスクリプトを実行する

私の現在の考えは、nltk で必要なことを実行するスクリプトを Python 2 で作成し、それを現在の Python 3 スクリプトから実行することです。しかし、私は実際にこれを行う方法を知りません。このコードを見つけたos.system(command)ので、次のように変更しますos.system("python py2.py")(py2.py は、新しく作成した Python 2 ファイルです)。それがうまくいくかどうかはわかりません。

また、それが私の問題を解決する最も効率的な方法であるかどうかもわかりません。インターネット上でそれに関する情報を見つけることができません。

転送されるデータはおそらく非常に大きくなります。現在、私のテスト データは約 6600 行、utf-8 です。私の場合、(ある程度)時間がかかることよりも機能性が重要です。

また、Python 2 スクリプトから Python 3 スクリプトに値を渡すにはどうすればよいでしょうか?

ありがとう

4

2 に答える 2

5

これを行う他の方法はありますか?

スクリプトを Python 2 に変換できないことが確実な場合は、Python インタープリターを実行して 1 つのスクリプトから別のスクリプトを呼び出すのがおそらく最善方法です。(そして、これは Python であり、最良の方法は唯一の方法であり、少なくともそうあるべきです。)

しかし、よろしいですか?sixモジュール、3to2ツール、およびステートメントの間では、__future__思ったほど難しくないかもしれません。

とにかく、一方のスクリプトで他方を呼び出す必要がある場合、ほとんど使用しないでくださいos.system。その機能のドキュメントが言うように:

このsubprocessモジュールは、新しいプロセスを生成し、その結果を取得するためのより強力な機能を提供します。この関数を使用するよりも、そのモジュールを使用することをお勧めします。役立つレシピについては、サブプロセスのドキュメントの「古い関数をサブプロセス モジュールに置き換える」セクションを参照してください。

最も単純なバージョンは次のとおりです。

subprocess.check_call(["python", "py2.py"])

これにより、スクリプトが実行され、終了するまで待機し、スクリプトが失敗を返した場合は例外が発生しますos.system。(たとえば、不要な余分なシェルを生成しない、エラー処理を処理するなど)。

これは、共有する必要のあるその他のデータが暗黙のうちに外部から共有されていることを前提としています (たとえば、同じ名前のファイルにアクセスするなど)。py2.pyコマンドライン引数 および/またはとしてデータを渡したりstdin、 経由stdoutでデータを戻したり、明示的なパイプまたはソケットを開いて物を渡したりする方がよい場合があります。何をする必要があるのか​​ を正確に知らなければ、何かを提案するのは難しいですが、ドキュメント、特に古い機能をモジュールに置き換えるsubprocessセクションには、オプションに関する多くの議論があります.

アイデアを提供するために、ここに簡単な例を示します。ファイル名引数の 1 つを に渡し、データを からにpy2.py戻すには、次のようにします。py2.pypy3.pypy3.py

py2output = subprocess.check_output(["python", "py2.py", my_args[0]])

そして、py2.pyあなたprintが送り返したいものは何でも。

于 2012-12-29T00:50:25.373 に答える
1

NLTK 3.0 がいつリリースされるか知っている人はいますか? ここでSOはそれを指摘しています...

Python 3 ブランチがあります。

https://github.com/nltk/nltk/tree/nltk-py3k

答えは 2011 年 7 月のものです。それ以降は改善される可能性があります。

https://github.com/nltk/nltkを見たところです。少なくとも、Python 3 ポートに関連するものについて説明しているドキュメントがあります https://github.com/nltk/nltk/blob/2and3/web/dev/python3porting.rst

興味のあるかもしれない NLTK と Python 3についてのより長い議論があります。

また、Grants to Assist Kivy、Porting to Python 3 の NLTK (3 日前に公開) は、この問題に直接関係しています。

于 2012-12-30T17:37:25.777 に答える