在 shell 脚本中读取 python 变量?

2023-11-26

我的 python 文件有这两个变量:

week_date = "01/03/16-01/09/16"
cust_id = "12345"

我如何将其读入接受这两个变量的 shell 脚本中?

我当前的 shell 脚本需要手动编辑“dt”和“id”。我想将 python 变量读入 shell 脚本,这样我就可以编辑我的 python 参数文件而不是那么多文件。

外壳文件:

#!/bin/sh

dt="01/03/16-01/09/16" 
cust_id="12345"

在一个新的 python 文件中,我可以导入参数 python 文件。


考虑类似以下内容:

#!/bin/bash
#      ^^^^ NOT /bin/sh, which doesn't have process substitution available.

python_script='
import sys
d = {}                                    # create a context for variables
exec(open(sys.argv[1], "r").read()) in d  # execute the Python code in that context
for k in sys.argv[2:]:
  print "%s\0" % str(d[k]).split("\0")[0] # ...and extract your strings NUL-delimited
'

read_python_vars() {
  local python_file=$1; shift
  local varname
  for varname; do
    IFS= read -r -d '' "${varname#*:}"
  done < <(python -c "$python_script" "$python_file" "${@%%:*}")
}

然后您可以将其用作:

read_python_vars config.py week_date:dt cust_id:id
echo "Customer id is $id; date range is $dt"

...或者,如果您不想在读取变量时重命名它们,只需:

read_python_vars config.py week_date cust_id
echo "Customer id is $cust_id; date range is $week_date"

优点:

  • 与简单的基于正则表达式的解决方案不同(它在 Python 解析的一些细节上会遇到麻烦——尝试教学sed处理原始字符串和常规字符串,以及单引号和三引号,而不使其变成毛球!)或使用来自 Python 子进程的换行符分隔输出的类似方法,这将正确处理任何对象str()给出 shell 脚本可以使用的不带 NUL 字符的表示形式。
  • 通过 Python 解释器运行内容还意味着您可以通过编程方式确定值 - 例如,您可以使用一些 Python 代码向版本控制系统询问相关内容的最后更改日期。

    想想这样的场景:

    start_date = '01/03/16'
    end_date = '01/09/16'
    week_date = '%s-%s' % (start_date, end_date)
    

    ...使用 Python 解释器来解析 Python 意味着您不会限制人们将来更新/修改您的 Python 配置文件的方式。

现在,我们来谈谈注意事项:

  • 如果你的 Python 代码有副作用,这些副作用显然会生效(就像你选择import文件作为 Python 中的模块)。不要使用它从您不信任内容的文件中提取配置。
  • Python 字符串是 Pascal 风格的:它们可以包含文字 NUL。 shell 语言中的字符串是 C 风格的:它们以第一个 NUL 字符终止。因此,某些变量可以存在于 Python 中,但如果没有非文字转义则无法在 shell 中表示。为了防止一个对象str()由于表示形式包含 NUL,以免向前溢出到其他赋值中,因此此代码在字符串的第一个 NUL 处终止字符串。

现在,我们来谈谈实现细节。

  • ${@%%:*}是一个扩展$@它会修剪第一个之后(包括第一个)的所有内容:在每个参数中,因此仅将 Python 变量名称传递给解释器。相似地,${varname#*:}是一个扩展,它修剪了所有内容,包括第一个:从传递给的变量名read. See 有关参数扩展的 bash-hackers 页面.
  • Using <(python ...)是进程替换语法:<(...)表达式的计算结果是一个文件名,读取该文件名时,将提供该命令的输出。使用< <(...)重定向该文件的输出,因此该命令(第一个<是一个重定向,而第二个是重定向的一部分<(启动进程替换的令牌)。使用此形式将输出放入while read循环避免了中提到的错误BashFAQ #24(“我在管道中的循环中设置变量。为什么它们在循环终止后消失?或者,为什么我不能通过管道读取数据?”).
  • The IFS= read -r -d ''构造有一系列组件,每个组件都会产生以下行为:read更忠实于原文内容:

    • 清算IFS在该命令的持续时间内,防止从变量内容的末尾修剪空白。
    • Using -r防止文字反斜杠被消耗read本身而不是在输出中表示。
    • Using -d ''设置空字符串的第一个字符''作为记录分隔符。由于 C 字符串以 NUL 结尾并且 shell 使用 C 字符串,因此该字符是 NUL。这确保变量的内容可以包含任何非 NUL 值,包括文字换行符。

    See BashFAQ #001(“如何逐行(和/或逐字段)读取文件(数据流、变量)?”)有关从 bash 中的字符串读取面向记录的数据的过程的更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 shell 脚本中读取 python 变量? 的相关文章

  • 使用 Python 创建 MIDI

    本质上 我正在尝试从头开始创建 MIDI 并将它们放到网上 我对不同的语言持开放态度 但更喜欢使用Python 两种语言之一 如果这有什么区别的话 并且想知道我应该使用哪个库 提前致谢 看起来这就是您正在寻找的 适用于 Python 的简单
  • ctypes 错误:libdc1394 错误:无法初始化 libdc1394

    我正在尝试将程序编译为共享库 我可以使用 ctypes 在 Python 代码中使用该库 使用以下命令该库可以正常编译 g shared Wl soname mylib O3 o mylib so fPIC files pkg config
  • 无故运行测试时 PyCharm 抛出“AttributeError: 'module' object has no attribute”

    因此 我有一个 Django REST Framework 项目 有一天它无法在 PyCharm 中运行测试 从命令行我可以使用它们来运行它们paver or the manage py直接地 曾经有一段时间 当我们没有在文件顶部导入类的超
  • cv2.drawContours() - 取消填充字符内的圆圈(Python,OpenCV)

    根据 Silencer的建议 我使用了他发布的代码here https stackoverflow com questions 48244328 copy shape to blank canvas opencv python 482465
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 使用 NLTK 在 Python 中获取大量名词(或形容词);或 Python Mad Libs

    Like 这个问题 https stackoverflow com questions 7439555 noun adjective etc word lists or dictionaries common words 我有兴趣按词性获取
  • “一旦获取切片就无法更新查询”。最佳实践?

    由于我的项目的性质 我发现自己不断地从查询集中取出切片 如下所示 Thread objects filter board requested board id order by updatedate 10 但这给我带来了实际对我选择的元素进
  • ImportError:运行 jupyter Notebook 时没有名为 IPython.paths 的模块?

    我通过以下方式安装了 jupyter usr local opt python bin python2 7 m pip install jupyter 这将安装 ipython 版本 4 1 2 但是 当我运行 jupyter Notebo
  • 使用 Python 计算 Spark 中成对 (K,V) RDD 中每个 KEY 的平均值

    我想与 Python 共享这个特定的 Apache Spark 解决方案 因为它的文档非常贫乏 我想通过 KEY 计算 K V 对 存储在 Pairwise RDD 中 的平均值 示例数据如下所示 gt gt gt rdd1 take 10
  • 如何使用 javascript/jquery/AJAX 调用 Django REST API?

    我想使用 Javascript jQuery AJAX 在前端调用 Django Rest API 请求方法是 POST 但当我看到 API 调用它的调用 OPTIONS 方法时 所以 我开始了解access control allow o
  • Python:我不明白 sum() 的完整用法

    当然 我明白你使用 sum 与几个数字 然后它总结所有 但我正在查看它的文档 我发现了这一点 sum iterable start 第二个参数 start 的作用是什么 这太尴尬了 但我似乎无法通过谷歌找到任何示例 并且对于尝试学习该语言的
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • 为什么我应该使用 WSGI?

    使用 mod python 一段时间了 我读了越来越多关于 WSGI 有多好的文章 但没有真正理解为什么 那么我为什么要切换到它呢 有什么好处 这很难吗 学习曲线值得吗 为了用 Python 开发复杂的 Web 应用程序 您可能会使用更全面
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • Python对象初始化性能

    我只是做了一些快速的性能测试 我注意到一般情况下初始化列表比显式初始化列表慢大约四到六倍 这些可能是错误的术语 我不确定这里的行话 例如 gt gt gt import timeit gt gt gt print timeit timeit
  • 从列表python的单个列表中删除子列表

    我已经经历过从列表列表中删除子列表 https stackoverflow com questions 47209786 removing sublists from a list of lists 但当我为我的数据集扩展它时 它不适用于我
  • grep 两个分隔符之间的子字符串

    我有很多bash使用的脚本perl内的表达式grep为了提取两个分隔符之间的子字符串 例子 echo BeginMiddleEnd grep oP lt Begin End 问题是 当我将这些脚本移植到运行的平台时busybox 融合的 g
  • Pure Bash 替换捕获组

    我有这个示例字符串 test string 13A6 该字符 数字可以是从 0 到 9 以及从 A 到 F 我想要这个输出 1 3 A 6 我有这个工作 result echo test string sed s g 我想在没有 sed 的

随机推荐

  • ionic 中自动增长文本区域

    我正在尝试向我的应用程序添加自动增长的文本区域 但由于某种原因它不起作用 我正在使用的模块是https github com tagged autogrow 在ionic论坛上推荐的 上面的答案并没有缩小 这是一个改进的版本 https c
  • 如何在 SQL Server Management Studio 上启用自动事务范围?

    我习惯于使用类似的工具Toad or PL Sql 开发人员对于 Oracle 我在查询窗口上运行的每个 SQL 语句都会在事务范围下自动运行 因此 如果我的 SQL 语句不正确 或者即使我错过了 SQL 脚本中的某些内容 我也只能通过单击
  • 如何通过单击模式窗口外部来关闭模式?

    在一个非常简单的 jQuery 模式中 我通过单击 CLOSE 来关闭模式 close click function e e preventDefault overlay alertModalOuter fadeOut 400 functi
  • 如何在ZF2中渲染具有布局的邮件模板?

    在 ZF1 中 我使用以下代码来呈现邮件正文 View erstellen view new Zend View Layout erstellen layout new Zend Layout HelperPath muss hier no
  • 用户输入+Ruby+正则表达式?

    我想为用户提供一个可以输入文本的文本区域 稍后我会将该输入与不同的输入进行匹配 如果匹配则将其提取 Flow 用户在文本区域中输入带回车的文本 文本保存在数据库的文本字段中 然后我使用以下内容来提取 text reply text repl
  • Python:这两个导入语句有什么区别?

    它们在功能上对我来说看起来都是一样的 使用其中一种与另一种相比有什么区别和优势吗 gt gt gt from datetime import datetime timedelta gt gt gt from datetime import
  • 从 com.apple.main-thread 入队(线程 1)崩溃 | iOS |斯威夫特 4.1

    上面发生了什么 从接收到的用户数据数组初始化领域模型 在后台线程中将所有模型一次性写入领域数据库中 如果领域模型已经存在 则通过创建副本进行更新 任何人都可以在这里指导我关于我做错了什么 我遇到了类似的问题 在这里 您可能正在从不同的线程访
  • 编译器对 PerformSelectorOnMainThread:@selector(delegateMethod) 发出警告

    我有一个包含一些 Web 服务功能的 NSOperation NSOperation 有一个委托 当操作结束时将向该委托发送消息 由于 NSOperation 位于不同的线程上 我必须像这样进行调用 delegate performSele
  • git:具有提交限制的累积差异

    git log有一些非常有用的提交限制选项 例如 no merges and first parent 我希望能够在为一系列提交生成累积差异补丁 stat numstat 时使用这些选项 使用这些命令 git log oneline fir
  • 为什么 const 限定变量被接受为 gcc 的初始值设定项?

    在最新版本的 gcc 或 clang 中编译此代码时 std c17 pedantic errors Wall Wextra static const int y 1 static int x y 然后我没有收到编译器诊断消息 即使我相当确
  • 如何用Java计算某人的年龄?

    我想在 Java 方法中以 int 形式返回以年为单位的年龄 我现在所拥有的是以下内容 其中 getBirthDate 返回一个 Date 对象 带有出生日期 public int getAge long ageInMillis new D
  • 如何等待elasticsearch重新索引?

    我有一个ElasticSearch带索引posts设置好的了 我会时不时地向其推送新文档 I want ElasticSearch仅当所有文档均已编制索引时才回复我的查询 我怎样才能做到这一点 在 ES 2 中 您可以调用refresh A
  • SQLITE:如果共享列,则将行合并为单行

    从上一篇文章中 我在 sqlite3 中有以下视图 CREATE View AttendeeTableView AS SELECT LastName FirstName as AttendeeName CompanyName PhotoUR
  • 编译器对虚函数调用的优化

    说明为什么虚拟分派在运行时发生的最流行的例子是当无法在编译时确定将创建哪个派生类时 例如 Base b rand 2 1 new Derived1 new Derived2 或者当它取决于用户输入时 假设情况并非如此 并且可以在编译时完全确
  • 如何使用实体框架查询外键对象?

    我正在尝试了解 Entity Framework 6 但遇到了一个问题 我已经能够在测试项目中重现该问题 A Movie has a Nameand a Revenue A Revenue has a GrossIncome public
  • “clear”是Javascript中的保留字吗?

    我只是花了很长时间才弄清楚我不应该使用clear 作为Javascript中函数的名称 Hello br
  • Winform另存为

    有谁知道任何文章或网站显示如何在 win 表单中创建 另存为 对话框 我有一个按钮 用户单击并序列化一些数据 然后用户使用此 另存为 框指定他们希望将其保存的位置 你的意思是像SaveFileDialog 来自MSDN示例 稍作修改 usi
  • C++ - 从文件读取到双精度[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我对编程还比较陌生 目前正在学习 C 课程 到目前为止我还没有遇到任何重大问题 我正在制作一个程序 其中 X 数量的评委可以打出 0 0 10 0 双倍 的分数 然后删除最高和最低的
  • 用 NSURLSession 替换 NSURLConnection

    我已经开始设计NetworkCommunication 我有一个设计NSOperation子类创建并管理自己的NSURLConnection The NSOperation子类由一个实例化NetworkManger类将其添加到NSOpera
  • 在 shell 脚本中读取 python 变量?

    我的 python 文件有这两个变量 week date 01 03 16 01 09 16 cust id 12345 我如何将其读入接受这两个变量的 shell 脚本中 我当前的 shell 脚本需要手动编辑 dt 和 id 我想将 p