【问题标题】:How to send text to some bash command outside python?如何将文本发送到 python 之外的一些 bash 命令?
【发布时间】:2021-06-21 20:45:15
【问题描述】:

我有脚本可以做一些工作:

python the_script.py 

此脚本完成后,我想将cd 放入脚本创建的目录并在那里执行 bash 操作。

我想实现这个:

python the_script.py | cd 

我试过了

sys.stdout.wrte("directory_name"),但它不起作用。


我可以创建一个变量然后使用它,但这不是我提出问题的重点,我想知道如何使用 python 将内容传递给其他命令并执行python+bash 脚本。

【问题讨论】:

    标签: python bash unix pipe


    【解决方案1】:

    试试cd "$(python the_script.py)"

    • $(...) 部分将是 the_script.py 的输出。
    • 然后"..." 将引用输出,以安全地处理包含空格的文件夹名称。

    【讨论】:

      【解决方案2】:

      some_command | cd 这样的结构本身没有任何意义,因为cd 会忽略标准输入。此外,您的方法存在这样一个问题,即它依赖于 Python 程序的标准输出必须包含 目录名称而不包含其他信息这一事实。只要您向标准输出 (print "something") 写入其他内容,您的程序就会中断。

      如果the_script.py 自行决定创建哪个目录是必要,将目录名写入某个文件而不是标准输出,然后在您的 bash 脚本中处理该文件脚本完成。在这种情况下,我会让调用者通过环境变量定义文件名:

      export file_holding_name_for_new_directory=$PWD/foo.$$ 
      python the_script.py
      if [[ -f $file_holding_name_for_new_directory ]]
      then
         cd $(<$file_holding_name_for_new_directory)
         rm $file_holding_name_for_new_directory
         # ... any further processing
      else
        : # error in the_script.py
      fi
      

      在 the_script.py 中,创建目录,如果成功,则获取环境变量的内容,创建该名称的文件并将目录名称写入该文件。

      当然,通过环境变量传递此文件的名称只是一种方法。另一种可能性是在命令行上传递此名称:

      file_holding_name_for_new_directory=$PWD/foo.$$ 
      python the_script.py $file_holding_name_for_new_directory
      if [[ -f $file_holding_name_for_new_directory ]]
      then
         cd $(<$file_holding_name_for_new_directory)
         rm $file_holding_name_for_new_directory
         # ... any further processing
      else
        : # error in the_script.py
      fi
      

      您采用哪种方法,是个人喜好问题。

      【讨论】:

      • 您说得对,除了 python 脚本中的目录名称之外,您无法打印任何其他内容。多亏了你,我才知道 cd 不读取标准输入。我正在做的是使用环境变量,但我认为这种方法不会是跨平台的。感谢您提供宝贵的信息。
      • 在什么方面你的意思是“不是不跨平台”?如果您有一个运行 bash 的平台,那么您就有环境变量。对我来说,不同之处主要在于美观:通常考虑通过命令行传递信息,而使用环境很容易,但闻起来像“快速而肮脏”的解决方案,并且在维护方面有一些缺点。
      • 我承认当我说“跨平台”时我用了一个太大的词。我的意思是任何人,无论是 windows 还是 linux 还是 unix,the_script 都应该是有用的。
      • 只要你坚持使用 bash 和 Python,唯一需要担心的就是使用 Cygwin 的 bash 运行为原生 Windows 构建的 Python(也许路径从一侧传递的问题)到下一个)。在任何情况下,您都必须列出要运行它的环境,以及您正在考虑的 bash 和 Python 实现类型。一般来说,您甚至谈论 bash / Python 的具体版本可能是有道理的,这样您就安全了(尽管对于您的问题,版本似乎并不重要)。
      • 是的,the_script 主要是独立的。但是如果想要将它集成到更多的东西中或者想要自动化的东西,他们很可能会使用 bash。就像你说的,我实际上不需要担心“跨平台”。感谢您的输入。顺便提一句。这不是生产级别或任何东西,只是我的个人项目。
      【解决方案3】:

      您可能想使用os module 自动更改位置 到新目录和subprocess module 以直接从python 脚本运行bash 命令,如下所示:

      import os
      import subprocess as sp
      
      os.chdir('your directory')
      sp.run(['ls', '-l'])
      

      【讨论】:

      • Alexound 感谢您让我知道在 python 中运行 bash 脚本。但是我想让使用这个脚本的人可以使用脚本中的信息而不直接更改源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2010-12-09
      相关资源
      最近更新 更多