0

我有一个 Python 3 文件。我想使用互联网上的开源工具(nltk),但不幸的是它只支持 Python 2。我无法将其转换为 Python 3,也无法将我的 Python 3 文件转换为 Python 2。

如果用户没有给出某个参数(在 argparse 上),那么我会在我的文件中做一些事情。但是,如果用户确实给出了某个论点,我需要使用 nltk。

编写一个使用 nltk 的 Python 2 脚本,然后在我的 Python 3 脚本中执行该脚本

我目前的想法是在 Python 2 中编写一个脚本,使用 nltk 执行我想要的操作,然后从我当前的 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 解释器让一个脚本调用另一个脚本可能是最好的方法。(而且,这是 Python,最好的方法是,或者至少应该是唯一的方法。)

但是你确定吗?在six模块、3to2工具和__future__语句之间,它可能没有你想象的那么难。

无论如何,如果您确实需要让一个脚本调用另一个脚本,您几乎不应该使用os.system. 正如该函数的文档所说:

subprocess模块提供了更强大的工具来生成新进程并检索其结果;使用该模块优于使用此功能。请参阅子流程文档中的用子流程模块替换旧功能部分以获取一些有用的秘诀。

最简单的版本是这样的:

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

这将运行您的脚本,等待它完成,并在脚本返回失败时引发异常——基本上,您想用 . 做什么os.system,但更好。(例如,它不会产生不必要的额外外壳,它会处理错误处理等)

这假设您需要共享的任何其他数据都以某种隐式的外部方式共享(例如,通过访问具有相同名称的文件)。您最好将数据py2.py作为命令行参数传递和/或stdin,将数据作为 via 传回stdout,或者甚至打开显式管道或套接字来传递数据。在不了解您需要做什么的情况下,很难提出任何建议,但是文档,尤其是用模块替换旧功能subprocess部分对选项进行了很多讨论。

为了给您一个想法,这里有一个简单的示例:将您的文件名参数之一传递给py2.py,然后从 获取数据py2.pypy3.py只需py3.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的更长讨论。

Porting to Python 3 中的 Grants to Assist Kivy, NLTK(3 天前发布)与该问题直接相关。

于 2012-12-30T17:37:25.777 回答