JOH*_*ÅTT 0 python python-2.x python-3.x
我有一个 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 脚本?
谢谢
有没有其他方法可以做到这一点?
好吧,如果您确定无法将脚本转换为 Python 2,那么通过运行 Python 解释器让一个脚本调用另一个脚本可能是最好的方法。(而且,这是 Python,最好的方法是,或者至少应该是唯一的方法。)
但你确定吗?在six模块、3to2工具和__future__语句之间,它可能没有你想象的那么难。
无论如何,如果您确实需要让一个脚本调用另一个脚本,您几乎不应该使用os.system. 正如该功能的文档所说:
该
subprocess模块提供了更强大的工具来生成新进程并检索它们的结果;使用该模块比使用此功能更可取。有关一些有用的秘诀,请参阅子流程文档中的用子流程模块替换旧函数部分。
最简单的版本是这样的:
subprocess.check_call(["python", "py2.py"])
Run Code Online (Sandbox Code Playgroud)
这将运行您的脚本,等待它完成,如果脚本返回失败,则引发异常——基本上,您想用 做什么os.system,但更好。(例如,它不会产生不必要的额外 shell,它会负责错误处理等。)
这假设您需要共享的任何其他数据都以某种隐式的外部方式共享(例如,通过访问具有相同名称的文件)。您最好将数据py2.py作为命令行参数和/或stdin传递给 ,将数据作为 via 传回stdout,甚至打开显式管道或套接字来传递内容。在不知道您需要做什么的情况下,很难提出任何建议,但是文档,尤其是用subprocess模块替换旧函数部分对选项进行了大量讨论。
为了给您一个想法,这是一个简单的示例:将您的文件名参数之一传递给py2.py,然后从py2.pyto取回数据py3.py,只需py3.py执行以下操作:
py2output = subprocess.check_output(["python", "py2.py", my_args[0]])
Run Code Online (Sandbox Code Playgroud)
然后在 中py2.py,print随便你想发回什么。