【问题标题】:Python subprocess.call issuePython subprocess.call 问题
【发布时间】:2015-12-21 14:40:34
【问题描述】:

当我在 Linux 的 Python 3.2.3 中运行以下命令时,它什么也不做......

subprocess.call("export TZ=Australia/Adelaide", shell=True)

但是,如果我在终端中运行它,它可以工作......

export TZ=Australia/Adelaide

我之前没有遇到过使用 subprocess.call 的问题。好像就是这个。我以超级用户身份运行,所以这不是 sudo 的事情,我还尝试在字符串前面放一个 r 以使其成为原始字符串。

有什么想法吗?谢谢。

【问题讨论】:

  • 如果你想在 Python 中修改环境变量,请阅读os.environ
  • @metatoaster 我知道了,但它仍然只是程序中的本地范围。当我退出程序时,它保持原样。有没有办法让操作系统永久更新? os.environ['TZ'] = '澳大利亚/阿德莱德' time.tzset()
  • 如果您的 Linux 发行版支持,您需要调用 OS/shell 特定的修改方法,例如修改 .bashrc/etc/environment/etc/timezone

标签: python linux subprocess call


【解决方案1】:

导出修改shell的环境。

当你通过子进程运行它时,会创建一个新的 shell,修改环境,然后立即销毁。

当您在 shell 中运行它时,它会修改该 shell 的环境,以便您可以看到效果。

【讨论】:

    【解决方案2】:

    A subprocess (shell in this case) can't (normally) modify its parent environment.

    在 Python 中为脚本及其子项设置本地时区(在 Unix 上):

    #!/usr/bin/env python3
    import os
    import time
    from datetime import datetime, timezone
    
    os.environ['TZ'] = 'Australia/Adelaide'
    time.tzset()
    print(datetime.now(timezone.utc).astimezone())
    # -> 2015-09-25 05:02:52.784404+09:30
    

    如果你想为单个命令修改环境,那么你可以传递env参数:

    #!/usr/bin/env python
    import os
    import subprocess
    
    subprocess.check_call('date', env=dict(os.environ, TZ='Australia/Adelaide'))
    # -> Fri Sep 25 05:02:34 ACST 2015
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多