简体   繁体   中英

Python3 exec, why returns None?

When the code below this text, and returns the result None why?

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)

Result:

777777
None

Module code exx.py:

print('777777')

The problem of course is not only that print returns None , it is that exec returns None , always.

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

If you'd need the return value, you'd use eval :

>>> eval('42')
42

after which you'd notice that print still returns None ...

Thank you all decided as follows:

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())

Print always returns none.

Also this is not how you should ever execute code from another module. That's what import is for.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM