命令行执行Python脚本的传参方式

命令行执行Python脚本的传参方式

应用场景

  • 在对ABAQUS进行二次开发时,需要将核心脚本的外部数据传递到脚本内部并执行
  • 核心脚本在运行时,可以调用所传递的变量参数
  • 命令行执行或者用户子程序执行

方式一

使用sys.args

简单示例

import sys

def test_sys_args():
    if len(sys.argv) > 1:
        print(len(sys.argv) - 1)
        print(sys.argv)
    else:
        print('无参数输入')
if __name__ == '__main__':
    test_sys_args()

执行

python test.py a 1 test

  • 脚本文件名后面的是需要传递的参数
  • 其它参数在命令行中传入时需要用空格分开
  • 若参数中需要包含“”,则需要使用到转义字符\进行转义

输出结果

3
['test.py', 'a', '1', 'test']
  • 3代表着传递参数的数量
  • sys.args实现从程序外部向程序传递参数,它的值是一个列表list,其中保存了通过命令行传递的各个参数
  • 输出sys.argv[0],即为第一个参数,是脚本本身
  • sys.argv[1]的输出结果为a

所以在二次开发的仿真脚本中,使用子程序进或命令行运行脚本,且需要使用此种方式进行传参时,需要将变量及其参数一并传递,具体使用方式如下

#执行脚本
child_process.exec(command val1=1 val2=2 val3=3)

脚本内部
sys.argv[1]输出结果为val1=1

  • 满足脚本对的变量需求,成功将脚本外的参数传递到脚本内

方式二

创建独立脚本参数文件

  • 使用node.js的文本操作fs模块
  • python的运行目录下创建单独的变量数据txt文件夹
  • 先读取变量数据,然后将变量根据格式拼接,最后将其写入单独的文本文件
  • 在执行python脚本时,只需在脚本中运行目录下的文本文件,就完成了参数的传递工作

如下所示

node.js后端

var fs = require('fs')

fs.writeFile('test.txt', _registerMsg, function (err) {

        if (err) {
            return console.log(err);
        } else {
            // 变量文件创建成功后,执行核心计算脚本
            exec("abaqus cae nogui=abaqus.py", function (error, stdout, stderr) {
                if (stdout.length > 1) {
                    // 计算成功
                    console.log('you offer args:', stdout);
                } else {
                    // 计算失败
                    console.log('you don\'t offer args');
                }
                if (error) {
                    console.info('stderr : ' + stderr);
                }
            })

        }
    })

脚本所需参数已经提前拼接并写入到_registerMsg变量中

python脚本

import io
with io.open("test.txt", encoding='utf-8') as f:
    code = f.read()
exec(code)

脚本只需打开同目录下的参数文件并执行,即可将参数传递到脚本中

两种方式的优缺点

  • 第一种方式能够对每个参数进行单独读取,但是也需要进行单独输出
  • 当需要传递参数较多时,每次运行脚本都要进行输入,工作量较大
  • 第二种方式将参数进行了集成,只需调整脚本中的变量,集合进行参数的修改
  • 在面向较多的参数时便于对参数的操作,能够提升效率

你可能感兴趣的:(Node.js,ABAQUS二次开发,学习笔记,node.js,经验分享,python)