我不是专业的程序员,所以我的知识有一些大漏洞(只是要提防)。
我已经在python 3.7中编写了一些库。但是现在我想从使用python 2.7的3D应用访问它们。到目前为止,据我所知,它们唯一真正的3.7具体功能是configparser(相对于ConfigParser)和打印功能。
我正在通过捕获importerror然后加载2.7版本来处理configparser问题。
我试图通过将以下行添加到3D应用程序中运行的脚本顶部来处理打印功能:
from __future__ import print_function
但是,当我导入一个具有python 3样式打印功能的模块时,会出现语法错误。但是,如果我在已加载的模块中包含from __future__
语句,则一切正常。显然,我在这里遇到了我的知识极限。
这是我要导入的模块的完整代码(称为test.py):
import sys
def print_error():
print("AND THIS IS?", file=sys.stderr)
这是3D应用程序(运行python 2.7)中的调用此代码的代码:
from __future__ import print_function
import sys
sys.path.append("/home/me/Documents/dev/")
print("WHY IS THIS NOT A SYNTAX ERROR?", file=sys.stderr)
from mylib import test
运行此代码时,得到以下输出:
WHY IS THIS NOT A SYNTAX ERROR?
00:00:08 Traceback (most recent call last):
00:00:08 File "<string>", line 7, in <module>
00:00:08 File "/home/me/Documents/dev/mylib/test.py", line 4
00:00:08 print("AND THIS IS?", file=sys.stderr)
00:00:08 ^
00:00:08 SyntaxError: invalid syntax
00:00:08
但是,如果我将from __future__
行放在test.py模块中,则一切运行正常。
我做错什么了吗?还是我需要在每个模块中都包含此行。如果是这样,我该如何与从python 3.7(我不想在其中加载打印功能from __future__
的地方)调用这些库的时代协调起来?
从我的研究看来,from __future__
是一个编译器指令,它控制在运行时如何编译脚本?也许?我对此有点不知所措。但这是否意味着每次加载模块时都必须提醒编译器使用from __future__
?
感谢所有帮助!
答案 0 :(得分:5)
在Python 3中,print
是a function,在Python 2中是keyword,因此基本上在Python 2中,它不需要参数file
。
您必须在每个模块的顶部添加from __future__ import print_function
,才能禁用该语句,并使用print()
函数,请在模块顶部使用此将来的语句。
From the docs,__future__
有3个用途:
避免混淆分析导入语句并找到要导入的模块的现有工具。
确保将来的语句在2.1之前的版本中运行至少会产生运行时异常。
何时引入不兼容的更改以及何时将它们变成强制性的文档。