代码编织梦想

【前言-给自己看的屁话】
最近玩python 遇到了这个问题,在网上查了下,大部分博客文章都是讲的同一种方法,看起来一知半解的,所以觉得自己有必要整理一下。


1、问题描述

无论是在windows下也好,Linux下也好,都有shell,windows下是powershell,Linux下是bash等。windows下的python 可以有IDLE,Linux下的python一般没有(这是我目前的认知,仅供参考,如有不当,还望不吝赐教)。

有时候,我们想用自己以前在写的python 脚本里面的函数时,不想再打开之前的python脚本进行修改或是再创建个python脚本来调用之前python 脚本里面的函数,而是想直接通过shell来调用python 脚本里面的函数,并且可以向函数传递参数,毕竟大多数函数都是需要参数的。这,便是这种诉求!

如果可以这么干的话(肯定可以这么干,只不过写到这里的时候我还不会),那么我便可以干好多事情了。

2、在shell里跑python脚本

在shell中跑python 脚本很容易,先看一个简单的python脚本:

#!/usr/bin/python3 
print("Hello, World!")

这个例子是从菜鸟里面摘抄的,关于第一行的理解,评论里有位大神这样写道:

关于实例中第一行代码#!/usr/bin/python3 的理解:
分成两种情况:
(1)如果调用python脚本时,使用:
python script.py #!/usr/bin/python 被忽略,等同于注释。
(2)如果调用python脚本时,使用:
./script.py #!/usr/bin/python 指定解释器的路径。

我很受启发。
下面在shell里面运行一下这个简单的脚本:

  • powershell
    在这里插入图片描述
    注意到第二条命令,它并没有运行这个脚本,而是用默认应用程序(我的时npp)打开了这个脚本,所以没有返回值,整个界面和焦点都跳到了npp上
  • bash
    在这里插入图片描述

3、调用函数

这块参考:https://blog.csdn.net/xuezhangjun0121/article/details/91958296
这个我试了,没成:https://www.bbsmax.com/A/LPdoKwVjd3/

跟着第一个链接跑了个例子:

  • St1:创建文件port.py并输入如下内容:
#!/usr/bin/python
# port.py
 
import socket
 
def scan(port):
    s = socket.socket()
    s.settimeout(0.1)
    if s.connect_ex(('localhost', port)) == 0:
        return 'port: ' + str(port) + ' open'
    else:
        return 'port: ' + str(port) + ' not open'
    s.close()
 
if __name__ == '__main__':
  scan()
  • St2:逐条输入指令:
checkresult=`python -c 'import port; print port.scan(80)'`
echo $checkresult
python -c 'import port; print port.scan(80)'

在这里插入图片描述
下面我自己写个看看可不可以用
创建文件mine.py并输入内容:

#!/usr/bin/python

def myfun(filepath,filename):
    longfilename=filepath+'/'+filename
    f=open(longfilename)
    flist=f.readlines()
    for line in flist:
        print(line)
    f.close()

if __name__ == "__main__":
    myfun()

然后新建个文本文件a.txt并输入如下内容(内容随便输入):

Hello world!
I am Bill O'Hanlon
I am learning Python
I am very happy!
Nice to meet you!
Good bye!

然后调用:

python -c 'import mine; mine.myfun(r"/home/ohanlon/Documents","a.txt")'

在这里插入图片描述
但是再powershell 里面就没成:
在这里插入图片描述
目前不知道原因,powershell看来和正常的shell还不一样。我的目的已经达到了,这个问题先放一放,以后再说。

4、通过sys模块向python脚本中传递参数

这个比较简单,下面看个例子即可。

#test.py
import sys
k = float(sys.argv[1])
y = sys.argv[2]
t = int(sys.argv[3])
print(k);print(type(k))
print(y);print(type(y))
print(t);print(type(t))
------------------
python .\test.py 2.3 sfansifjdnj 4  #python3 powershell
python test.py $g $q $s   #python2 linux-bash

在这里插入图片描述
在这里插入图片描述
若想将脚本执行结果存储进shell变量中该怎么办呢?

a1=`python test.py $g $q $s`

若想用多个变量来存储python脚本执行结果该怎么办呢?

a1 a2 a3=`python test.py $g $q $s`

这样是不行的,我们可以将python脚本执行结果存到a1里面,这时候a1是个字符串:

4.76 <type 'float'> ndjknfkjs <type 'str'> 1 <type 'int'>

可以看到,它存储的就是上面print的内容,只不过用空格将每个print的内容隔开而已,若直接转化成array的话array=($a1),会将<type 'float'>分成两部分的,因为它中间有个空格。这样的话,我们可以在输出上下点功夫:加;,如下:

import sys
k = float(sys.argv[1])
y = sys.argv[2]
t = int(sys.argv[3])
print(k); print(';');  print(type(k)); print(';')
print(y); print(';');  print(type(y)); print(';')
print(t); print(';');  print(type(t))

这样,a1就变成了

4.76 ; <type 'float'> ; ndjknfkjs ; <type 'str'> ; 1 ; <type 'int'>

之后以;为分隔符转化为字符数组:

array=(${a1//;/ })

本来以为这样就可以,但是还是不行,因为array=(str})会默认以空格为分割符将字符串分割为数组的。那么就要先改变一下默认分割符再变回来了,操作如下:

OLD_IFS="$IFS"
IFS=";"
array=($a1)
IFS="$OLD_IFS"
echo ${#array[@]}  #6
echo ${array[1]}   #<type 'float'>

ok!

5、向python函数中传递shell中的变量

怎样可以实现将 shell 中的变量传递给 python 脚本中的函数呢?也就是说,我想用python脚本中的一个函数,但是是我懒得把这个函数从这个脚本中分离出来,而是想直接来用。
目前来看确实没有很好的解决方法,看来不可以偷懒了。

总结

python 脚本scrpit.py一般可写为:

def function_name(param):
        return reparam
 
if __name__ == "__main__":
        function_name()  #其实这两行可以不要。

调用:

python -c 'import script; print script.function_name(param)'

或者:

result=`python -c 'import script; print script.function_name(param)'`
echo $result

shell中的变量传递给python脚本

import sys
k = float(sys.argv[1])
y = sys.argv[2]
t = int(sys.argv[3])
-------------
python test.py $g $q $s   #调用

python 脚本执行完之后将结果传出来(用print),多个变量的话,自选一个分割符,在多个变量之间加入print('分割符')

a1=`python test.py $g $q $s`
OLD_IFS="$IFS"
IFS=";"
array=($a1)
IFS="$OLD_IFS"

最后的结果会以字符数组的方式(一个变量一个索引)存在于array中。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/Gou_Hailong/article/details/111091452

函数上(Python笔记)-爱代码爱编程

1.1函数的概念 函数可以理解为实现某种功能的代码块,这样当程序中需要这个功能时就可以直接调用,而不必每次都编写一次。这就好比生活中使用计算器来计算,当需要计算时,直接使用计算器输入要计算的数,计算完成后显示计算结果,而不必每次计算都通过手写演算出结果。 在程序中,如果需要多次输出“拼搏到无能为力,坚持到感动自己!”,则可以将这个功能写成函数,具体示例如

python笔记2:指定概率生成数据-爱代码爱编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python笔记2:指定概率生成数据 一、random指定范围随机生成数1. *random.choice()在指定数据集内生成随机数*2. *random.sample(x,n)在指定数据集内生成随机数组*二、random指定概率随机生成数 一、random指定范围随机生成数

用python处理DEA模型--CCR-爱代码爱编程

python解决DEA模型–CCR 本人所用软件为gurobi,在python中运算。 gurobi的下载请自行前往官网:https://www.gurobi.com/。 本篇文章针对基础CCR模型,给出代码。 本篇例子的运行数据贴在下图,数据量很小,大家可自行敲在excel中运行。最后一列投入导向型CCR的效率结果。只需要把DMUs、x1、x2、

Python3 《零基础小白从入门到实战》之“for循环”-爱代码爱编程

for循环,每次循环,循环变量都会获取遍历对象中的一个值,执行循环体语句,当遍历对象中的值,全部获取完毕,停止循环。 for 被循环的数据需要多个数据 for循环可以循环 list, tuple, dict, str 语法格式: for 循环变量 in 遍历(循环)对象: 循环体 例如1: for i in (

python的 lambda() filter() isinstance() setattr()-爱代码爱编程

1、lambda: g = lambda x:x+1 使用lambda定义一个匿名函数,如上所示,x作为函数的入口参数,x+1为函数体 2、filter(function,iterable) 该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到

Python网络编程之六:操作系统发展史及网络编程总结-爱代码爱编程

Python网络编程之六:操作系统发展史及网络编程总结 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。 现代计算机系统是一个复杂的系统。 一、为什么要有操作系统 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的

shell中的基础命令-爱代码爱编程

1.diff 用法; diff xxx yyy 输出信息: [num1,num2][a|c|d][num3.num4] num1,num2 #第一个文件的行 a #添加 c #更改 d #删除 < #第一个文件中的内容 > #第二个文件中的内容 num3,num4 #第二个文件中的行 常用参数: -b #忽略空格 -B #忽

Linux 误删文件恢复命令及方法-爱代码爱编程

你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 http://r6d.cn/JzNf 推荐:https://www.xttblog.com/?p=5120 前言 无论在哪个系统中,删除文件都是必须谨慎的操作。 因为如果不小心删除了重要文件,就会导致个人或公司出现重大

推荐一款日志切割神器,好用到爆!!-爱代码爱编程

来源:r6d.cn/QN53 对于 Linux 系统安全来说,日志文件是极其重要的工具。不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分 Nginx日志之类的 CRON 脚本,大家似乎遗忘了 Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过! logrotate

linux三剑客和管道(基本使用)-爱代码爱编程

linux三剑客和管道,基本使用 本文目录三剑客和管道基本介绍正则表达式grep命令grep实战sed命令sed实战awk命令awk实战 本文目录 三剑客和管道基本介绍 管道:用 | 表示,把 | 前命令的结果作为 | 后命令的输入 正则表达式 grep命令 擅长查找字符串grep常用命令和参数 一般写法为:Grep [参数]正

liunx文件处理命令-爱代码爱编程

liunx文件处理命令 liunx文件处理命令基本命令cdVimlschmod更改文件所有权文件描述符 liunx文件处理命令 基本命令 cd cd - 返回进入此目录之前所在的目录 例:原来在/home/lg52778738目录下,进入根目录,使用CD -,返回了进入根目录前的/home/lg52778738目录下 Cd 进入当前

shell的并行执行-爱代码爱编程

第一部分加()&是并行执行一段程序,第二段将 ()&注释掉,是串行执行一段程序,从执行时间上可以看出来区别 并行执行耗费了九秒,为三次调用最长的那个耗时,串行执行耗时18秒,为三次调用的时间之和 [oracle@scaqad02adm01 lstorm]$ cat t.sh #!/usr/bin/sh set -o nounset dem