【问题标题】:how to use python to do a series of commands in terminal如何使用python在终端执行一系列命令
【发布时间】:2015-01-07 03:04:46
【问题描述】:

我将以下内容放入我的python_go.py

import os
os.system("cd some_dir") # This is the directory storing an existing virtual environment
os.system(". activate") #because I want to activate the virtual environment
os.system("cd another_dir") #this the directory I can start my work

我希望我可以运行python_go.py,它可以完成上述工作。

但是当我运行它时,它似乎只能做第一步,其余的,例如. activate 似乎不起作用。

谁能告诉我怎么做?谢谢!!

【问题讨论】:

  • . activate 这是什么??
  • 为什么不直接创建一个shell脚本呢?使用 Python 有什么意义?顺便说一句,它是./activate,而不是. activate
  • 你能教如何使用 Shell Script 来完成这项工作吗?
  • 如果您告诉我们您要完成的工作,将会有所帮助。虽然让 python 脚本激活 virtualenv 是一种选择,但有许多(可以说是更好的)选项,比如让 python 直接调用你的 virtualenv 应用程序,以及其他一些选项。那么,您尝试运行的 virtualenv 中有什么?

标签: python shell python-3.x terminal virtualenv


【解决方案1】:

很可能您不必将some_dir 改为源activate,因此请保存这些行

. some_dir/activate
cd another_dir

比如说go.sh 和做

. go.sh

效果一样

【讨论】:

    【解决方案2】:

    如果您依赖 os.system(".activate") 来工作,如果它位于目录 some_dir 中,那将无法工作,因为当前目录不会在对 os.system() 的调用中持续存在。

    你最好调用一个 shell 脚本来聚合你想要执行的所有三个命令并从 python 脚本中执行一次。

    否则,您想在激活调用上调用 os.system 之前使用 os.chdir() 为父 python 进程设置环境。此外,os.system(".activate") 调用不会执行您想要的操作,因为“点空间”表示法会将信息加载到 shell 中,当 os.system 调用完成时该 shell 将消失。

    已编辑(对您的后续评论):

    您的 shell 脚本应如下所示 (do_activate.sh):

    cd some_dir
    . activate
    cd another_dir
    

    和这样的python代码:

    os.system("db_activate.sh").

    请记住,“.activate”保存的任何环境变量在 os.system 调用后都不会持续存在。

    【讨论】:

      【解决方案3】:

      您的代码什么都不做。 os.system() 为每个命令启动一个新的 shell,即所有的 os.system() 调用都没有积极影响:cd. activate 可能只对 current shell(可能还有它的孩子)有影响.

      如果您只想在当前 shell 中激活 virtualenv,那么您应该使用 shell 命令:

      $ . some_dir/activate && cd another_dir
      

      注意:该命令仅对当前(正在运行的)shell(及其后代)有效。

      virtualenvwrapper 提供了几个钩子,允许在激活 virtualenv 之前/之后执行命令,例如,您可以将 cd another_dir 放入 $VIRTUAL_ENV/bin/postactivate 中,然后运行就足够了:

      $ workon <virtualenv-name>
      

      激活virtualenv-name virtualenv 并运行所有挂钩(在本例中为cd another_dir)。

      【讨论】:

        【解决方案4】:

        您可能想要安装 virtualenvwrapper 来满足您的需求:

        • workon envname 将获取文件并激活 virtualenv。

        然后您可以在所需的目录中执行setvirtualenvproject,您将自动转到项目所在的目录。您只需要执行一次此命令,因为它会从那时起自动执行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-11
          • 2018-04-09
          • 2019-08-04
          • 1970-01-01
          • 2016-04-05
          • 2021-08-04
          • 2012-05-22
          • 1970-01-01
          相关资源
          最近更新 更多