2015-04-12 168 views
-2

当此代码下面的代码,并返回结果None为什么?Python3 exec,为什么返回None?

with open('exx.py', 'rb') as file: 
ff = compile(file.read(), 'exx.py', 'exec') 
snip_run = exec(ff, locals()) 
if 'result' in locals(): 
    print(snip_run, result) 
else: 
    print(snip_run) 

结果:

777777 
None 

模块代码exx.py:

print('777777') 
+0

尝试打印(打印('777777')) –

+0

'None'与...相反...什么?你在期待什么?就目前而言,这甚至不是有效的语法。 – jonrsharpe

+0

返回相同的东西:print(exec(open('exx.py')。read())) – Strelok2014Strelok

回答

2

当然,问题不仅在于print回报None,它是exec returns None,始终。

>>> exec('42') is None 
True 

如果你需要的返回值,你会使用eval

>>> eval('42') 
42 

之后,你会发现,print仍返回None ...

-1

打印总是返回无。

此外,这不是你应该如何执行从另一个模块的代码。这就是导入的目的。

+0

谢谢你正是你想要的!) 你可以让print()不返回None? – Strelok2014Strelok

+0

不,你不能。 –

-1

谢谢大家决定如下:

import sys 
from io import StringIO 
from contextlib import contextmanager 


@contextmanager 
def stdoutIO(stdout=None): 
    old = sys.stdout 
    if stdout is None: 
     stdout = StringIO() 
    sys.stdout = stdout 
    yield stdout 
    sys.stdout = old 


with stdoutIO() as s: 
    with open('exx.py', 'rb') as file: 
     ff = compile(file.read(), 'exx.py', 'exec') 
     exec(ff, locals()) 
     if 'result' in locals(): 
      sys.stdout.write(locals().get('result')) 

print(s.getvalue()) 
相关问题