python exec() 菜鸟教程上的例子,最后一个结果为34的看不懂,求教
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python exec() 菜鸟教程上的例子,最后一个结果为34的看不懂,求教相关的知识,希望对你有一定的参考价值。
如题
exec(expr, 'x':1,'y':2) 这句很明显:30+1+2=33exec(expr, 'x':1,'y':2, 'y':3,'z':4)这句:
x传入的是1,y第一个传入的是2,第二次传的是3将之前的2覆盖了。所以y是3,z传入的是4。但是在expr里面重新给z赋值了30,所以结果是30+1+3=34追问
哦 这个意思是 先对 exec() 内的进行赋值, 也就是先用字典的赋值, 然后用 sum外部的赋值 也就是z 对吧 , 是有个顺序的
追答嗯,对的
参考技术A math.exp(-x)应该用np.exp(-x);The Zen of Python是Python语言的指导原则,遵循这些基本原则,Python代码有下列四大特征就成为一个准高手了:
1. 丰富的注释,包含参数说明,函数/类用途,甚至大段原理阐述与例子。
2. 充分用好装饰器/Python内嵌函数等高级功能。
3. 完善的异常处理,比如RuntimeError, ValueError。
4. 严格的PEP8规范代码。
Windows 上的 os.exec
【中文标题】Windows 上的 os.exec【英文标题】:os.exec on Windows 【发布时间】:2011-10-23 16:45:12 【问题描述】:我有一个将os.execvp
调用到另一个Python 实例的脚本。执行此操作后,我似乎附加到了一个 cmd.exe
实例,而不是我刚刚创建的 Python 实例。然而,Python 实例会响应 Ctrl+C。
H:\bin>Python 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500
32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('hi')
Can't find file ('hi')
H:\bin>
H:\bin>
KeyboardInterrupt
>>> echo hi
hi
拨打exec
:
from sys import argv
os.execvp('python', argv)
根据在 Linux 上可能看到的行为,如何将原始 Python 实例替换为新实例?
【问题讨论】:
相关:bugs.python.org/issue9148。根据 Amaury Forgeot d'Arc 的 comment - 在 Windows 上,exec()
并没有真正取代当前进程。它创建一个新进程(使用新的 pid),并退出当前进程。因此调用程序只看到脚本已经终止。我在 Windows 上没有看到任何简单的解决方案,除了使用 subprocess.Popen()
,并在子进程终止时退出脚本。在你的情况下,它看起来像一个可能的解决方案吗?
感谢@PiotrDobrogost 的有用评论。如果您将 Python 问题中的材料与此问题相关联,则将构成解决方案。
你的意思是先调用subprocess.Popen()
然后退出原来的Python进程?
@PiotrDobrogost:是的,为了关注同样问题的人们的利益,他们应该得到一个干净的解决方案和理由。
@MattJoiner 嗨,我在尝试将库移植到 Windows 时偶然发现了这一点。我正在努力寻找一个基于subprocess.Popen
的完整的工作示例。知道在哪里可以找到吗?
【参考方案1】:
在 Unix 上,执行二进制文件分为两个阶段 - fork(3) 克隆当前进程,exec(3) 将可执行文件加载到地址空间。在 Windows 上只有 CreateProcess 与 fork+exec 做同样的事情。
为了便携性,最好的办法是使用subprocess.Popen(与 os.* 对应物不同,它在 Windows 上也可以正确引用文件名),如 http://docs.python.org/library/subprocess.html#replacing-the-os-spawn-family
【讨论】:
您能否链接到提及 Windows 上不同的os.exec*
行为?我的印象是 exec 在 Windows 上受支持,请参阅here
您发布的 url 中的第一段:“这个系列中的每个函数都加载并执行一个 new 进程”。在 MS CRT 中,它们只是 CreateProcess 的包装器。
当一个_exec函数调用成功时,新进程被放置在调用进程之前占用的内存中。必须有足够的内存来加载和执行新进程。 在示例 exec 调用之后,还有一条注释 /* This point is reached only if exec fails. */
。
我怀疑该行是从 POSIX.1 规范中逐字复制的。 “达到这一点”:参见任何 _exec 的描述,“返回值”子句。 “如果成功,这些函数不会返回到调用进程”,它们会在成功的 CreateProcess() 调用 iirc 时调用 ExitProcess()。
有关 CreateProcess 如何在内部工作的详细信息,请参阅scribd.com/doc/51979000/122/Flow-of-CreateProcess以上是关于python exec() 菜鸟教程上的例子,最后一个结果为34的看不懂,求教的主要内容,如果未能解决你的问题,请参考以下文章