- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
上下文
我正在开发一个模拟集群。为了尽可能灵活(使用不同的模拟软件),我们创建了一个 python 文件来解析定义环境变量的配置文件,以及启动模拟的命令行。该命令通过 SLURM sbatch 命令(shell $COMMAND)启动
问题
从 python 中,所有环境变量都通过读取配置文件进行注册我对使用其他环境变量(显示为 shell 变量)的变量 COMMAND 有问题
例如
COMMAND = "fluent -3ddp -n$NUMPROCS -hosts=./hosts -file $JOBFILE"
os.environ['COMMAND']=COMMAND
NUMPROCS = "32"
os.environ['NUMPROCS']=NUMPROCS
[...]
exe = Popen(['sbatch','template_document.sbatch'], stdout=PIPE, stderr=PIPE)
sbatch 将 COMMAND 分发到所有模拟节点,因为 COMMAND 是命令行
命令调用其他保存的环境。变量。 Shell 将其严格解释为文本...这使得命令行失败。它严格作为使用 $ 而非变量的字符串,例如:'flutter -3ddp -n$NUMPROCS -hosts=./hosts -file $JOBFILE'
我正在寻找的解决方案
我正在寻找一个简单的解决方案解决方案 1:使用 1 到 3 个 python 命令行来评估 COMMAND 作为 shell 命令来回显解决方案 2:使用 Shell 命令将“字符串”$COMMAND 中的变量作为变量进行计算最后从 sbatch 中启动的命令应该是
fluent -3ddp -n32 -hosts=./hosts -file /path/to/JOBFILE
最佳答案
您有几个选择:
部分或不支持 bash 的变量替换,例如实现一些 python 功能来重现 bash 的 $VARIABLE
语法。
重现配置文件中支持的所有 bash 变量替换工具( $VARIABLE
、 ${VARIABLE}
、 ${VARIABLE/x/y}
、 $(cmd)
- 等等。
让 bash 来完成繁重的工作,以牺牲性能和可能的安全性为代价,具体取决于您对配置文件内容的信任。
我将在这里展示第三个,因为它是最具弹性的(同样,尽管存在安全问题)。假设您有这个配置文件 config.py
:
REGULAR = "some-text"
EQUALS = "hello = goodbye" # trap #1: search of '='
SUBST = "decorated $REGULAR"
FANCY = "xoxo${REGULAR}xoxo"
CMDOUT = "$(date)"
BASH_A = "trap" # trap #2: avoid matching variables like BASH_ARGV
QUOTES = "'\"" # trap #3: quoting
然后你的Python程序就可以运行下面的咒语:
bash -c 'source <(sed "s/^/export /" config.py | sed "s/[[:space:]]*=[[:space:]]*/=/") && env | grep -f <(cut -d= -f1 config.py | grep -E -o "\w+" | sed "s/.*/^&=/")'
这将产生以下输出:
SUBST=decorated some-text
CMDOUT=Thu Nov 28 12:18:50 PST 2019
REGULAR=some-text
QUOTES='"
FANCY=xoxosome-textxoxo
EQUALS=hello = goodbye
BASH_A=trap
然后您可以使用 python 来读取它,但请注意引号现在已经消失,因此您必须考虑到这一点。
咒语解释:
bash -c 'source ...instructions... && env | grep ...expressions...'
告诉 bash 读取并解释指令,然后 grep 表达式的环境。我们将把配置文件转换成修改 bash 环境的指令。
如果您尝试使用set
而不是env
,输出将与引用不一致。使用env
避免陷阱#3。
说明:我们将为表单创建说明:
export FANCY="xoxo${REGULAR}xoxo"
以便 bash 可以解释它们和 env
可以阅读它们。
sed "s/^/export /" config.py
为变量添加前缀 export
。 sed "s/[[:space:]]*=[[:space:]]*/=/"
将赋值格式转换为 bash 可以读取的语法 source
。使用s/x/y/
而不是s/x/y/g
避免陷阱#1。source <(...command...)
使 bash 将命令的输出视为文件并一行一行地运行。当然,避免这种复杂性的一种方法是让文件一开始就使用 bash 语法。如果是这种情况,我们将使用 source config.sh
而不是source <(...command...)
.
表达式:我们想要 grep env
的输出对于类似 ^FANCY=
的模式.
cut -d= -f1 config.py | grep -E -o "\w+"
在 config.py
中查找变量名称.sed "s/.*/^&=/"
将变量名称变为 FANCY
grep 搜索表达式,例如 ^FANCY=
。这是为了避免陷阱 #2。grep -f <(...command...)
获取grep
将命令的输出视为每行包含一个搜索表达式的文件,在本例中为 ^FANCY=
, ^CMDOUT=
等等编辑
由于您实际上只想将此环境传递给另一个 bash 命令而不是在 python 中使用它,因此您实际上可以让 python 运行此命令:
bash -c 'source <(sed "s/^/export /" config.py | sed "s/[[:space:]]*=[[:space:]]*/=/") && $COMMAND'
(假设在配置文件中指定了COMMAND
)。
关于python - 从 python 评估 "Shell command line with shell variables"或将 python 字符串评估为 shell 命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59095318/
当前问题陈述的输入是 - 输入.txt #START_OF_TEST_CASES #DATA key1:VA1 key2:VA2 key3:VA3 key4:VA4 key5:VA5 #DEND #E
编辑:添加了 PDO 调用。 这是实际的错误: Notice: Object of class PDOStatement could not be converted to int in Unknow
“git diff --stat”和“git log --stat”显示如下输出: $ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56
我有一个具有以下格式的输入文件:安大略省:布兰普顿:北纬 43° 41':西经 79° 45'安大略省:多伦多:北纬 43° 39':西经 79° 23'魁北克省:蒙特利尔:北纬 45° 30':西经
空白行仅包含\n或\r\n或\r。 tempfile = open(file,"r") for id,line in enumerate(tempfile): if(line != "\n"
我尝试使用 BABYLON.js 开发棋盘游戏我有一个板子和一个 ArcRotateCamera。 我的灯是 HemisphericLight 当我在板上画线时,我希望这些线具有相同的外观。现在,当我
我尝试使用 BABYLON.js 开发棋盘游戏我有一个板子和一个 ArcRotateCamera。 我的灯是 HemisphericLight 当我在板上画线时,我希望这些线具有相同的外观。现在,当我
有一个while read循环: while read line; do grep "^$line" file1 done < target 我应该使用 "^$line" 来获得正确答案。我想
我有一个我无法解决的 numpy 问题。我有填充 0 和 1 的 3D 数组 (x,y,z)。例如,z 轴上的一个切片: array([[1, 0, 1, 0, 1, 1, 0, 0],
作为临时方法,我使用 .txt 文件来存储程序的某些变量。写入与 fs.appendFile 完美配合,但考虑到它的大小,使用 fs.readFile 读取不合适 - 我想得到某一行 来自文件,以及
我试图找到一种通过R studio进行调试的方法,但是我发现的所有解决方案都无法真正起作用。 1.)CTRL + enter:有效,但不会通过循环的每次迭代,而只能执行一次。 2.)添加“browse
在我的应用程序中,我的 EditText 左侧有行号 - 到目前为止一切都很好,行号与 EditText 的行完全对齐。 问题是,如果用户更改 EditText 的文本大小,则行号无法正确对齐。所以我
通过使用 + 的参数调用它,我可以使 vim 将光标定位在文件的最后一行。 : vi + myfile # "+" = go to last line of file 我怎样才能做到
我已经在文件中写入了这样的数据(某种) {:a 25 :b 28} {:a 2 :b 50} ... 我想要这些 map 的惰性序列。 大约有 4000 万行。我也可以写 10000 的 block
我在文本区域中发现了一个奇怪的错误(?)... 比如说,有一个 使用多行文本(用户粘贴的文本或预设文本无关紧要,两者都经过测试)。 我想从 中获取文本并替换 \n与其他东西......结果是,.re
我需要一个新行,这样我就可以在 PFD 中看到一个格式,我尝试添加一个页面宽度但它没有用,我用另一个东西/n 也没有用。这是我的代码。我可以手动添加格式,因为我需要显示从数据库中获取的信息,并且我在一
我正在尝试编写一个 Java 程序,它将大量 GPS 坐标捕捉到线形文件(道路网络),并且不仅返回新坐标,还返回捕捉到的线段的唯一标识符。该标识符是否是 FID、其他语言中使用的“索引”(即,其中 1
你好,我正在努力处理 JavaScript/NodeJS 中的数组。 基本上,这是我的代码: let arr = new Array(); arr = { "Username" : var1,
我正在学习 matplotlib 的基本教程,我正在处理的示例代码是: import numpy as np import matplotlib.pylab as plt x=[1,2,3,4] y=
所以,假设我有一个包含 20 行的文本文件,每行都有不同的文本。我希望能够有一个包含第一行的字符串,但是当我执行 NextLine(); 时我希望它成为下一行。我试过了,但它似乎不起作用: strin
我是一名优秀的程序员,十分优秀!