當前位置:首頁 » 編程語言 » 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