【问题标题】:Calling multiple commands using os.system in Python在 Python 中使用 os.system 调用多个命令
【发布时间】:2013-12-01 06:34:13
【问题描述】:

我想从我的 python 脚本中调用多个命令。 我尝试使用 os.system(),但是,当当前目录更改时,我遇到了问题。

示例:

os.system("ls -l")
os.system("<some command>") # This will change the present working directory 
os.system("launchMyApp") # Some application invocation I need to do.

现在,第三次调用启动不起作用。

【问题讨论】:

    标签: python unix subprocess command


    【解决方案1】:

    os.system 是标准 C 函数 system() 的包装器,因此它的参数可以是任何有效的 shell command,只要它适合为环境和参数列表保留的内存一个过程。

    因此,将这些命令用分号或换行符分隔,它们将在同一环境中按顺序执行。

    os.system(" ls -l; <some command>; launchMyApp")
    
    os.system('''
    ls -l
    <some command>
    launchMyApp
    ''')
    

    【讨论】:

      【解决方案2】:

      您可以使用os.chdir()切换回您需要所在的目录

      【讨论】:

        【解决方案3】:

        os.system("ls -l &amp;&amp; &lt;some command&gt;")

        【讨论】:

          【解决方案4】:

          很简单,真的。 对于 Windows,使用 &amp; 分隔您的命令,对于 Linux,使用 ; 分隔它们。
          str.replace 是解决问题的一种非常好的方法,在下面的示例中使用:

          import os
          os.system('''cd /
          mkdir somedir'''.replace('\n', ';')) # or use & for Windows
          

          【讨论】:

            【解决方案5】:

            试试这个

            import os
            
            os.system("ls -l")
            os.chdir('path') # This will change the present working directory
            os.system("launchMyApp") # Some application invocation I need to do.
            

            【讨论】:

              【解决方案6】:

              随便用

              os.system("first command\nsecond command\nthird command")

              我想你已经知道该怎么做了

              【讨论】:

                【解决方案7】:

                每个进程都有自己的当前工作目录。通常,子进程不能更改父进程的目录,这就是为什么cd 是一个内置的 shell 命令:它在同一个(shell)进程中运行。

                每个os.system() 调用都会创建一个新的shell 进程。更改这些进程中的目录不会影响父 python 进程,因此不会影响后续的 shell 进程。

                要在同一个 shell 实例中运行多个命令,您可以使用 subprocess 模块:

                #!/usr/bin/env python
                from subprocess import check_call
                
                check_call(r"""set -e
                ls -l
                <some command> # This will change the present working directory 
                launchMyApp""", shell=True)
                

                如果您知道目标目录; use cwd parameter suggested by @Puffin GDI instead.

                【讨论】:

                  【解决方案8】:

                  尝试使用subprocess.Popencwd

                  示例:

                  subprocess.Popen('launchMyApp', cwd=r'/working_directory/')
                  

                  【讨论】:

                  • 我可能不知道更改后的目录。有没有办法从上一次调用中获取更改后的目录?这样我就可以在调用“launchMyApp”时传递它
                  • 如果需要从cmd获取输出。也许你可以参考(stackoverflow.com/questions/1388753/…
                  • p = subprocess.Popen( ...) line = p.stdout.readline()
                  【解决方案9】:

                  当你调用 os.system() 时,每次你创建一个子 shell - 当 os.system 返回时立即关闭(subprocess是调用操作系统命令的推荐库)。如果您需要调用一组命令 - 在一次调用中调用它们。 顺便说一句,您可以从 Python 更改工作主管 - os.chdir

                  【讨论】:

                  • 你能分享一个使用子流程的例子吗?
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-09-04
                  • 2021-03-02
                  • 2015-07-02
                  • 1970-01-01
                  • 2018-09-14
                  相关资源
                  最近更新 更多