当前位置:首页 » 编程语言 » pythoninvoke

pythoninvoke

发布时间: 2023-10-01 16:03:26

‘壹’ windows下python实现自动ssh网络设备执行多条命令并保存显示结果用什么库实现

假设从主机A,检查主机B上的进程,
需要在主机B上建立检查用户,例如叫x,
并设置通过public key认证登录SSH,不会可以google搜一下,

然后,在A机器上执行:
ssh x@B ~/command.sh > result.txt

command.sh就是B机器上放置在x目录下的脚本
输出结果应该是写到了result.txt

或者另一种写法
result=`ssh x@B ~/command.sh`

结果直接保存到result变量中了。

暂时没有linux环境,所以没有实际测试,你自己试试吧

‘贰’ 使用python 实现SSH登录设备时出现问题

解决了啊,不过不是用的
stdin,stdout,stderr=client.exec_command('show arp;show clock')
用这种方法只能弄一条命令
用下面这个
chan= client.invoke_shell()
chan.send('en\n')
chan.send("password\n")
chan.send('show log\n')
result = chan.recv(100000).decode()
用了这个可能还有别的问题,试试吧,不行再讨论

‘叁’ python - Poetry介绍

一、简介
Poetry 是一个Python 中的好用的包管理工具。在 Python 中,打包系统和依赖管理非常复杂:一个项目经常要同时创建多个文件,例如:

setup.py
requirements.txt
setup.cfg
MANIFEST.in
Pipfile
基于此, poetry 将所有的配置都放置在一个 toml 文件中,包括:依赖管理、构建、打包、发布等,可谓是简单方便。

二、安装
Poetry 要求 Python 版本为 2.7 或者 3.5+。Poetry 官方提供了一个脚本,可以快速方便地进行安装。

osx / linux / bashonwindows 安装:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
windows powershell 安装:

(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py -UseBasicParsing).Content | python -
Poetry 会被安装在系统中的如下位置:

$HOME/.local/bin Unix系统
%APPDATA%PythonScripts Windows系统
然后把路径添加到系统变量 PATH 中,即可使用 poetry 命令调用:

poetry --version

卸载:

python install-poetry.py --uninstall
POETRY_UNINSTALL=1 python install-poetry.py
如果你想要改变安装的默认路径,可以设置 POETRY_HOME :

POETRY_HOME=/etc/poetry python install-poetry.py
除了官方的安装脚本,也可以使用 pipx 或者 pip 进行安装:

pipx install poetry
pipx upgrade poetry
pipx uninstall poetry
pip install --user poetry

更新:

poetry self update

三、基础使用
在已有项目中执行:

poetry init
该命令创建了一个pyproject.toml 文件。你可以手动修改 pyproject.toml 文件添加依赖,然后运行:

poetry install
也可以执行 add 命令安装具体某个模块并自动添加到 pyproject.toml:

$ poetry add xxxx
默认情况下,poetry会在 {cache-dir}/virtualenvs 下创建虚拟环境,你也可以手动修改该配置项,或者在 pyproject.toml 配置[virtualenvs.in-project] 在你的项目目录中创建虚拟环境。

你可以使用 run 命令在虚拟环境中运行脚本:

poetry run python your_script.py
或者直接激活你的虚拟环境,新建一个 shell 运行:

poetry shell
只安装dependencies :

poetry install --no-root
更新所有锁定版本的依赖:

poetry update

四、命令选项
全局选项:

--verbose (-v|vv|vvv): "-v" 正常输出, "-vv" 详细输出 "-vvv" debug
--help (-h) : 帮助信息
--quiet (-q) : 不输出任何信息
--ansi: 强制 ANSI 输出
--no-ansi: 禁止ANSI 输出
--version (-V): 显示版本
--no-interaction (-n): 禁止交互询问

NEW:

poetry new my-package
创建项目模板,项目结构如下所示:

my-package
├── pyproject.toml
├── README.md
├── my_package
│ └── init .py
└── tests
└── init .py

init:创建pyproject.toml文件 。

install:读取pyproject.toml并安装依赖,它具有如下这些选项:

--without: 忽略依赖
--with: 安装可选的依赖
--only: 只安装指定的依赖
--default: 只安装默认的依赖
--sync: 同步锁定的版本至环境中
--no-root: 不安装根依赖包
--dry-run: 输出操作但不执行
--extras (-E): 安装额外的包

update:升级包

poetry update
不指定任何包时,更新所有,也可以指定升级包:

poetry update requests toml
它具有如下选项:

--dry-run : 输出操作但不执行
--no-dev : 不按照开发依赖
--lock : 只更新锁定不安装

add: 添加依赖并安装

限制范围:

poetry add penlum@^2.0.5
poetry add "penlum>=2.0.5"
它具有如下选项:

--group (-D): 分组
--editable (-e): 添加到编辑模式
--extras (-E): 添加额外的依赖
--optional: 添加至可选依赖
--python: 指定python版本
--platform: 指定操作系统
--source: 使用源名称安装
---allow-prereleases: 接受 prereleases 安装
--dry-run: 输出操作但不执行
--lock: 只更新锁定不安装

remove:移除依赖

它具有如下选项:

--group (-D): 分组
--dry-run : 输出操作但不执行

show:列出所有的可安装的包

如果你想看具体某个包的信息:

poetry show penlum

name : penlum
version : 1.4.2
description : Python datetimes made easy

dependencies:

--without: 忽略依赖
--with: 同时显示
--only: 只显示指定的依赖
--default: 只显示默认的
--no-dev: 不显示开发的依赖
--tree: 以树状形式显示
--latest (-l): 展示最新的版本
--outdated (-o): 显示最新版本,但仅适用于过时的软件包

build:构建

publish:发布

config:配置项

使用方法:

poetry config [options] [setting-key] [setting-value1] ... [setting-valueN]
它具有如下选项:

--unset: 删除配置项
--list: 展示现在的配置

run:在虚拟环境中执行命令

shell:激活虚拟环境

check:检查pyproject.toml文件

search:搜索远程包

lock:锁定版本

version:显示版本

export:导出锁定的文件为其他的格式

poetry export -f requirements.txt --output requirements.txt
它具有如下选项:

--format (-f): 转换的格式,暂时只支持requirements.txt
--output (-o): 输出文件名字
--dev: 包括开发的依赖
--extras (-E): 额外的依赖
--without-hashes: 忽略哈希
--with-credentials: 包括合格证书

env:与虚拟环境进行交互

cache:缓存

显示缓存列表:

poetry cache list
清除缓存:

poetry cache clear pypi --all

plugin:插件

安装插件:

poetry plugin add poetry-plugin
显示插件列表:

poetry plugin show
移除插件:

poetry plugin remove poetry-plugin

source: 仓库源

添加源:

poetry source add pypi-test https://test.pypi.org/simple/
显示仓库源列表:

poetry source show
移除:

poetry source remove pypi-test

五、配置
你可以运行config命令进行配置,或者直接修改config.toml文件,这个文件通常位于:

macOS: ~/Library/Application Support/pypoetry
Windows: C:Users<username>AppDataRoamingpypoetry
Unix~/.config/pypoetry
可以使用--local命令对具体项目进行配置:

poetry config virtualenvs.create false --local
配置项:

cache-dir缓存目录
installer.parallel并行安装
virtualenvs.create如果不存在,则新建一个虚拟环境
virtualenvs.in-project在项目根目录创建虚拟环境
virtualenvs.path虚拟环境路径
virtualenvs.options.always-复制源文件还是创建链接到虚拟环境
virtualenvs.options.system-site-packages虚拟环境获得系统包的权限
repositories.<name>设置一个新的可选仓库

六、依赖配置
依赖的配置有很多种写法:

版本限制:

尖括号:^1.2 代表 >=1.2.0 <2.0.0
波浪号:~1.2.3 代表 >=1.2.3 <1.3.0
星号:1.* 代表 >=1.0.0 <2.0.0

使用git仓库:

[tool.poetry.dependencies]
requests = { git = " https://github.com/requests/requests.git " }
使用本地路径:

[tool.poetry.dependencies]

my-package = { path = "../my-package/", develop = false }

my-package = { path = "../my-package/dist/my-package-0.1.0.tar.gz" }
使用URL:

[tool.poetry.dependencies]

my-package = { url = " https://example.com/my-package-0.1.0.tar.gz " }
python限制:

[tool.poetry.dependencies]
pathlib2 = { version = "^2.2", python = "~2.7" }
环境限制:

[tool.poetry.dependencies]
pathlib2 = { version = "^2.2", markers = "python_version ~= ƈ.7' or sys_platform == 'win32'" }

组合:

[tool.poetry.dependencies]
foo = [
{version = "<=1.9", python = "^2.7"},
{version = "^2.0", python = "^3.4"}
]

如果限制很多,写成一行不方便阅读,可以写成多行:

[tool.poetry.group.dev.dependencies]
black = {version = "19.10b0", allow-prereleases = true, python = "^3.6", markers = "platform_python_implementation == 'CPython'"}
写成多行后:

[tool.poetry.group.dev.dependencies.black]
version = "19.10b0"
allow-prereleases = true
python = "^3.6"
markers = "platform_python_implementation == 'CPython'"

分组功能:

[tool.poetry.group.test.dependencies]
pytest = "^6.0.0"
pytest-mock = "*"
例如以上,就建立了一个test的组合的依赖。

下面这两种写法是等价的:

[tool.poetry.dev-dependencies]
pytest = "^6.0.0"
pytest-mock = "*"
或者:

[tool.poetry.group.dev.dependencies]
pytest = "^6.0.0"
pytest-mock = "*"
以上两种写法都声明了一个dev的组的依赖。

声明组合是可选的,这在具体的环境中有的特定的用途时很有用:

[tool.poetry.group.docs]
optional = true

[tool.poetry.group.docs.dependencies]
mkdocs = "*"

添加依赖到组中:

poetry add pytest --group test

同步依赖,只使用poetry.lock中的依赖,移除其他不是必须的依赖:

poetry install --sync

七、环境管理
Poetry可以为项目使用独立的虚拟环境,而不是使用系统安装的。

切换环境:

poetry env use /full/path/to/python
poetry env use python3.7
poetry env use system
显示当前激活的环境信息:

poetry env info
运行命令会输出如下信息:

Virtual environment
Python: 3.7.1
Implementation: CPython
Path: /path/to/poetry/cache/virtualenvs/test-O3eWbxRl-py3.7
Valid: True

System
Platform: darwin
OS: posix
Python: /path/to/main/python
列出所有的虚拟环境列表:

poetry env list
删除环境:

poetry env remove /full/path/to/python
poetry env remove python3.7
poetry env remove 3.7
poetry env remove test-O3eWbxRl-py3.7

‘肆’ 如何让python调用C和C++代码

要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的<<Extending && embedding>>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在<<Python Programming On Win32>>书中找到了教程。
1. 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:/Program Files/Python25/DLLs),假如我们接下来要写的扩展mole名为mb,python调用的代码为:import mbmb.showMsg("Python's really amazing, I kindda love it!")
2. 搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。
在vs 2005下点击菜单 "工具"->"选项", 打开选项对话框,选择"项目和解决方案->VC++目录", 然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:/Program Files/Python25/include"),然后选择库文件,添加python的libs目录(我的机器上是"F:/Program Files/Python25/libs")。
既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码:
#include <python.h> //python.h是包含python一些定义的头文件,在python的include目录下/*我的python版本是2.5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll,
想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息*/#pragma comment(lib, "python25.lib")//先不管static PyObject* mb_showMsg(PyObject* self, PyObject *args);/*如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用
extern "C" __declspec(dllexport) void initmb(){/*当调用mb.showMsg("Python's really amazing, I kindda love it!")时, 相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式,定义一个字典数据结构,key => showMsg, value =>mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧*/static PyMethodDef mbMethods[] = {
{"showMsg", mb_showMsg, METH_VARARGS},
{NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/};//告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里
PyObject *m = Py_InitMole("mb", mbMethods);}/*接下来实现核心功能showMsg*///第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple
static PyObject* mb_showMsg(PyObject* self, PyObject *args){//我们的showMsg函数需要的是一个字符串参数
const char* msg = NULL;/*调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址,
如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址,
这个函数的原型是类似printf的不定参数的形式
PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...);*/if (!PyArg_ParseTuple(args, "s", &msg))
return NULL;//调用MBint r = ::MessageBox(NULL, "hello", "Caption:Form C mole", MB_ICONINFORMATION | MB_OK);//返回值return Py_BuildValue("i", r);}将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:import mbmb.showMsg("Python's really amazing, I kindda love it!")

‘伍’ Python 函数中,参数是传值,还是传引用

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思?
函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。
值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈数森中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参掘掘变量。
在python中实际又是怎么样的呢?
先看一个简单的例子:

from ctypes import *
import os.path
import sys

def test(c):
print "test before "
print id(c)
c+=2
print "test after +"
print id(c)
return c

def printIt(t):
for i in range(len(t)):
print t[i]

if __name__=="__main__":
a=2
print "main before invoke test"
print id(a)
n=test(a)
print "main afterf invoke test"
print a
print id(a)

运行后结果如下:

>>>
main before invoke test
39601564
test before
39601564
test after +
39601540
main afterf invoke test
2
39601564

id函数可以获得对象的内存地址.很明显从上面例子可以看出,将a变量作为参数传递给了test函数,传递了a的一个引用,把a的地址传递过去了,所以在函数内获取的变量C的地址跟变量a的地址是一样的,但是在函数内,对C进行赋值运算,C的值从2变成了4,实际上2和4所占的内存空间都还是存判毕核在的,赋值运算后,C指向4所在的内存。而a仍然指向2所在的内存,所以后面打印a,其值还是2.
如果还不能理解,先看下面例子

>>> a=1
>>> b=1
>>> id(a)
40650152
>>> id(b)
40650152
>>> a=2
>>> id(a)
40650140

a和b都是int类型的值,值都是1,而且内存地址都是一样的,这已经表明了在python中,可以有多个引用指向同一个内存(画了一个很挫的图,见谅),在给a赋值为2后,再次查看a的内存地址,都已经变化了

而基于最前面的例子,大概可以这样描述:

那python函数传参就是传引用?然后传参的值在被调函数内被修改也不影响主调函数的实参变量的值?再来看个例子。

from ctypes import *
import os.path
import sys

def test(list2):
print "test before "
print id(list2)
list2[1]=30
print "test after +"
print id(list2)
return list2

def printIt(t):
for i in range(len(t)):
print t[i]

if __name__=="__main__":
list1=["loleina",25,'female']
print "main before invoke test"
print id(list1)
list3=test(list1)
print "main afterf invoke test"
print list1
print id(list1)

实际值为:

>>>
main before invoke test
64129944
test before
64129944
test after +
64129944
main afterf invoke test
['loleina', 30, 'female']
64129944

发现一样的传值,而第二个变量居然变化,为啥呢?
实际上是因为python中的序列:列表是一个可变的对象,就基于list1=[1,2] list1[0]=[0]这样前后的查看list1的内存地址,是一样的。

>>> list1=[1,2]
>>> id(list1)
64185208
>>> list1[0]=[0]
>>> list1
[[0], 2]
>>> id(list1)
64185208

结论:python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。

分类: python 基础语法

热点内容
虚幻4编译到哪里 发布:2025-01-15 16:50:19 浏览:754
透明度渐变android 发布:2025-01-15 16:45:08 浏览:833
dos连接oracle数据库 发布:2025-01-15 16:41:39 浏览:904
网络配置比较低怎么做 发布:2025-01-15 16:35:38 浏览:361
android弹出键盘监听 发布:2025-01-15 16:35:11 浏览:207
uz画图编程 发布:2025-01-15 16:32:44 浏览:883
ppt怎么解压 发布:2025-01-15 16:14:58 浏览:849
服务器地址配置规则 发布:2025-01-15 16:03:45 浏览:987
冰箱加氟后压缩机发烫 发布:2025-01-15 16:03:00 浏览:834
文件输入输出java 发布:2025-01-15 15:54:54 浏览:164