作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] os.environ 和 os.putenv
时间Thu May 12 22:40:44 2016
※ 引述《obelisk0114 (追风筝的孩子)》之铭言:
: 一.
: 假如只是要获得某个环境的绝对路径,例如: AppData
: os.getenv('LOCALAPPDATA') 和 os.environ['LOCALAPPDATA']
: 完全一样吗 ?
getenv 在 key 不存在时会回传 default (预设是 None)
所以其实是和 os.environ.get() 一样
: 二.
: 若作业系统支援 os.putenv()
: 使用 os.environ 则会自动呼叫 os.putenv 来改变环境变量
: 若直接使用 os.putenv 而不透过 os.environ 时, 则不会改变 os.environ 里的变量
: 但是 python 不是不能直接操作作业系统吗,
: 所以结束 python 之後环境变量还是一样
: 这样两者有何差别 ?
首先, Python「可以」操作作业系统
不过这个先不管
差别在於, 如果你在 putenv 後开启一个 subprocess
(包含用 os.system, subprocess 等等)
这个子程序
会看到 os.putenv 设定的变数
但程序本身并不会看到
另一方面, 直接修改 environ 则是可以被程序本身使用, 子程序也会看到
: 三.
: 作业系统不支援 os.putenv() 时,
: os.environ 会创造一个新的程序来使用修改过的环境变量
: 实际用途是甚麽 ?
没这种事, 你读错文件了
文件说的是, 如果作业系统不支援 putenv
则子程序会使用 os.environ 的一个 copy 作为它的环境
如果有 putenv, 则修改 os.environ 会直接触发 putenv
这种情况下子程序就不需要这个 mapping, 直接和作业系统要环境变数即可
: 四.
: 有些作业系统, 像是 FreeBSD 和 Mac OS X, 设定 os.environ 会导致记忆体泄漏
: 程式终止或是结束 python 可以重新取回该漏失的记忆体吗 ?
可以
: 直接使用 os.putenv() 也会造成记忆体泄漏吗 ?
会
: 有可能重新用另一段程式码来使用该漏失的记忆体吗 ?
不行
---
其实除非你要用到非常接近 C API 的功能, 只要记住一句话就好了
『永远使用 os.environ, 假装其他的都不存在』
你研究那麽多其实没什麽用
--
1F:→ GNUGCC:void main(void) 的写法是可行的唷^^08/10 00:59
2F:→ GNUGCC:虽然这个写法较传统,但是语法与文法都正确哦^^08/10 02:16
3F:→ GNUGCC:目前我使用的 Visual C++ 都接受 void main(void) 与 08/10 20:18
4F:→ GNUGCC:int main(void),各位可以把 C++ 专案改成原生 C++ 类型来 08/10 20:19
5F:→ GNUGCC:用 void main(void) 来写发现也可通过编译. 08/10 20:21
6F:→ GNUGCC:这个就是 Visual C++ 的弹性.08/11 20:23
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.19.12
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1463064046.A.4CC.html
7F:推 obelisk0114: python 可以不透过呼叫 cmd 直接修改作业系统的环境? 05/13 16:51