我创建了一个我在另一个程序中使用的模块。
模块打印一些文本,睡眠一秒钟,然后打印更多文本(在同一行,没有任何空格)。
我正在运行python 2.7,而from __future__ import print_function
是程序中调用模块的第一行,但是当我导入模块时,我收到此错误:
Traceback (most recent call last):
File "C:\######\document.py", line 3
1, in <module>
import mymodule
File "C:\######\document.py", line 2
print("hello world", end=' ')
^
SyntaxError: invalid syntax
这是代码:
def run():
print("hello world", end =' ')
time.sleep(0.5)
print(".", end =' ')
time.sleep(0.5)
print(".", end =' ')
time.sleep(0.5)
print(".")
time.sleep(0.25)
如何在不导入print_function
两次的情况下解决此问题?
答案 0 :(得分:7)
我正在运行python 2.7,并在调用我的模块的程序中导入了print_function
这不起作用。您必须在此模块中执行将来的语句,而不是在导入它的脚本或模块中。
有关详细信息,请参阅the documentation。但是简短的版本是:future语句改变了模块编译的方式,因此Python必须能够在模块编译时看到它,而不仅仅是在运行时。 (这也是为什么它必须是文件中的第一个非注释/文档字符串行。)
好的,这样就解释了如何修复它,但它没有解释为什么会出现问题,除非你已经知道模块编译何时发生。
过度简化:当您import spam
时(如果在此会话期间尚未导入),Python会寻找合适的spam.py
文件。如果找到一个,则会查找比spam.pyc
更新的spam.py
。如果是这样,它只是执行它。如果没有,它会将spam.py
编译为spam.pyc
,然后执行它。
因此,由于未来的语句会影响代码的编译方式,如果Python希望让您的未来语句影响您导入的其他模块,则必须为每个可能的未来组合存储不同版本的spam.pyc
陈述 - 可能是spam.pyc
,spam+print_function.pyc
,spam+division.pyc
,spam+print_function+division.pyc
等。
最后:
如何在不导入print_function两次的情况下解决此问题?
你真的不能。好吧,你可以,但你不想这样做。我能想象到的最简洁和最简单的方法是编写一个import hook来覆盖查找和编译.pyc
文件的常用机制,以确保将import
的所有内容视为一样将所有未来的陈述都应用(可能使用上面提到的spam+print_function.pyc
技巧,以确保您不会与普通的缓存.pyc
文件冲突。(参见{{3有关让模块继承未来标志或明确指定一组标志的信息的文档。)
如果这听起来真的很酷,那么了解Python的导入系统会很有趣,但我强烈建议等到你之前升级到至少Python 3.4,因为它已经改变了很多,并且为了更好;它更容易学习(特别是因为整个事情都是用Python编写的,并且完整记录,而不是散布在三个不同地方的C代码),而且更灵活(所以你通常不需要复制一半) Python通常为您做什么,您可以只替换您想要更改的那个部分。