【问题标题】:how to set the bash scripts with in the python scripts rather than having separate scripts?如何在 python 脚本中设置 bash 脚本而不是使用单独的脚本?
【发布时间】:2017-11-08 09:54:45
【问题描述】:

这就是我运行 myscript.sh

中设置的 bash 脚本的方式
#!/bin/bash
import subprocess
child = subprocess.Popen(['bash', '-c', '/bin/bash myscript.sh'], stdout = subprocess.PIPE)
output=child.communicate()
print(output)

myscript.sh

我为什么要这样做是因为我必须运行的 bash 脚本没有导出命令,所以我在这里呼应。代码如下。我知道回显不会设置环境变量,但我只想回显它并获取值,因此回显而不是导出。

#!/bin/bash
source ia_servers
echo $IA_SRV_cs68_64

在哪里$IA_SRV_cs68_64

这是列出变量值的 ia_servers 文件 它看起来像这样

IA_SRV_cs68_64="ds1 ds2 ds3 ds5 "

这就是变量在其中的方式。很多其他变量都因为设置太长而在里面去掉了。

TESTED 在终端上运行良好:

  • 来源 ia_servers
  • 回显 IA_SRV_cs68_64

打印所需的值集

问题: 虽然 myscript.sh 正在工作并打印变量。我想要的是我不想创建一个单独的文件,在那里写一个 bash 脚本来回显 myscript.sh 中的变量,而是将它写在 python 中。

我如何在 python 中完成它而不是制作 脚本文件并运行它。

【问题讨论】:

    标签: python bash shell environment-variables environ


    【解决方案1】:

    这是运行任何类型的脚本或程序的通用方法,其中程序输入嵌入在 Python 脚本中。

    import subprocess
    scriptres = subprocess.Popen("/bin/bash", 
                                 stdin=subprocess.PIPE,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE).communicate(r'''
    # your bash script here
    ls
    pwd
    source whatever
    echo $SOMETHING
    ''')
    
    script_stdout = scriptres[0]
    script_stderr = scriptres[1]
    

    【讨论】:

    • 我做的是一样的。我的要求不同
    【解决方案2】:
    # i assume there is a file by name `ia_servers` with variable IA_SRV_cs68_64="ds1 ds2 ds3 ds5 "
    
    import imp
    ia_servers =imp.load_source('ia_servers', 'path to `ia_servers` file')
    
    print ia_servers.IA_SRV_cs68_64 # this should print `ds1 ds2 ds3 ds5` 
    

    【讨论】:

    • 我认为即使不使用 bash 脚本也可以做到这一点。这是你想要的吗?
    • 那个文件路径有环境源。想要加载它并回显我们的变量。尝试这种方法说 AttributeError: 'module' object has no attribute 'IA_SRV_cs68_64'
    • 这个错误是因为你无法导入ia_servers,我上次拼错了。
    • 我尝试使用正确的名称。 >>> import imp >>> ias_server=imp.load_source('ias_servers',' ./ ') #alsotried with' .' >>> print(ias_server.IA_SRV_cs68_64) 还是一样
    • 用 dir() 检查。它没有这样的属性。还检查了是否是路径问题,因为 ias_servers 与我尝试过的路径相同。还有'./'没有效果
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2017-12-29
    • 2013-02-08
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多