1. 如何使用python執行遠程shell腳本
可以使用Python的Fabric包來完成這項任務。
既然是談到Shell腳本,系統應該是linux/Unix的,遠程訪問,應該是ssh吧。
Fabric功能是將一個任務通過ssh在多台伺服器上執行,而每個任務可以是單條shell指令或是一段python腳本。
Fabric是將Python, Shell和SSH的功能很優雅地結合在了一起,同時自身又非常的輕量,適合大部分伺服器群的日常管理工作。
2. 編寫shell腳本運行python文件
(已嘗試mac自帶的文本編輯器,腳本編輯器無法編寫.sh文件)
運行後出現vim主界面,代表mac有vim,並且成功進入了vim
想要運行.py文件,直接使用絕對路徑即可(此路徑可以通過直接拖進終端即可獲得,或者使用快捷鍵Option+Command+C 復制文件途徑。)
格式: /可執行文件所在目錄/可執行文件
到這里簡單可以運行regression.py文件的shell腳本寫好了。
解決辦法:修改rt.sh文件許可權,命令為:
解決辦法:同問題一
查了資料問題是'(',')'要使用轉義,才可以識別即'(',')'。所以在最開始打開regression.py文件把所有的括弧都加了一遍,這種方法不會再出現括弧的錯誤,但是這並不是一個合理的解決辦法,這樣太麻煩了,而且編寫時是不會這樣處理的,所以在看了另一個別人的腳本時,發現在.py腳本的頭部,即第一行加了一句話
這時使用未做過括弧處理的.py文件,也不會報錯了!
可參考: https://blog.csdn.net/wh_19910525/article/details/8040494
regression.py在不使用rt.sh文件是可以成功運行的,但是此時出現no mole錯誤。
開始以為是quandl自己安裝的問題,在python2.7是Quandl,python3.6是quandl,所以在終端使用pip3,pip分別安裝,但是運行時還會出現同樣問題,但發現一個問題不管是在使用pip,還是pip3在終端運行時,均會說此包已存在,但存在路徑均為python3.6下,所以嘗試更改regression.py文件的頭部第一行,更改為: #!/usr/bin/env python3
可以正常運行了!!!!
還是開心的曬一下,結果吧。(雖然和腳本無關了,哈哈哈哈哈)
對於使用shell腳本,傳遞參數,後續進行學習總結,今天就總結好編寫shell腳本運行python文件吧!
3. python執行shell,報錯:未找到命令
我打算用python來執行shell命令,實現sqoop導數據功能
腳本如下:
mysql_jdbc="jdbc:mysql://{0}:{1}/{2}?characterEncoding=utf8&autoReconnect=true"
sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
--connect $mysql_jdbc \
--username {3} \
--password {4} \
--table {5} \
--target-dir {7} \
--delete-target-dir \
--split-by clientid
然後報錯:sqoop:未找到命令
然後我就測試:subprocess.run("java -version",shell=True)
也是報錯:java:未找到命令
網上一頓網路,查了胡行2天啊~~~~
1、檢查/etc/profile環境變數設置沒問題
2、linux機器上直接執行java -version也正常
3、linux機器上執行python3後,執行subprocess.run("java -version",shell=True)也正常輪悔
我就奇了怪了,還擺不平你這小娘子
後來突然想到之前項目里,先生效一下profile文件,試了一下,果然臘做正有效!!!
我的親娘誒,絕望之際,解救了我~~~
至於為什麼一定要這樣,還是不解
正確腳本:
shell_str ="""
source /etc/profile;
java -version
"""
subprocess.run(shell_str, shell=True)
4. 如何python 中運行scapy shell
啟用shell
可以使用如下命令啟用shell
[python] view plain
scrapy shell <url>
其中<url>就是你想抓取的頁面url
使用shell
Scrapy shell可以看成是一個內置了幾個有用的功能函數的python控制台程序。
功能函數
shelp() - 輸出一系列可用的對象和函數
fetch(request_or_url)-從給定的url或既有的request請求對象重新生成response對象,並更新原有的相關對象
view(response)-使用瀏覽器打開原有的response對象(換句話說就是html頁面)
Scrapy 對象
使用Scrapy shell下載指定頁面的時候,會生成一些可用的對象,比如Response對象和Selector對象(Html和XML均適用)
這些可用的對象有:
crawler - 當前的Crawler對象
spider
request - 最後獲取頁面的請求對象
response - 一個包含最後獲取頁面的響應對象
sel - 最新下載頁面的Selector對象
settings - 當前的Scrapy settings
Scrapy shell例子
以我的個人博客作為測試:http://blog.csdn.net/php_fly
首先,我們啟動shell
[python] view plain
scrapy shell http://blog.csdn.net/php_fly --nolog
以上命令執行後,會使用Scrapy downloader下載指定url的頁面數據,並且列印出可用的對象和函數列表
[python] view plain
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x0000000002AEF7B8>
[s] item {}
[s] request <GET http://blog.csdn.net/php_fly>
[s] response <200 http://blog.csdn.net/php_fly>
[s] sel <Selector xpath=None data=u'<html xmlns="http://www.w3.org/1999/xhtm'>
[s] settings <CrawlerSettings mole=None>
[s] spider <Spider 'default' at 0x4cdb940>
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
獲取曾是土木人博客的文章列表超鏈接
[python] view plain
In [9]: sel.xpath("//span[@class='link_title']/a/@href").extract()
Out[9]:
[u'/php_fly/article/details/19364913',
u'/php_fly/article/details/18155421',
u'/php_fly/article/details/17629021',
u'/php_fly/article/details/17619689',
u'/php_fly/article/details/17386163',
u'/php_fly/article/details/17266889',
u'/php_fly/article/details/17172381',
u'/php_fly/article/details/17171985',
u'/php_fly/article/details/17145295',
u'/php_fly/article/details/17122961',
u'/php_fly/article/details/17117891',
u'/php_fly/article/details/14533681',
u'/php_fly/article/details/13162011',
u'/php_fly/article/details/12658277',
u'/php_fly/article/details/12528391',
u'/php_fly/article/details/12421473',
u'/php_fly/article/details/12319943',
u'/php_fly/article/details/12293587',
u'/php_fly/article/details/12293381',
u'/php_fly/article/details/12289803']
修改scrapy shell的請求方式:
[python] view plain
>>> request = request.replace(method="POST")
>>> fetch(request)
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x1e16b50>
...
從Spider中調用Scrapy shell
在爬蟲運行過程中,有時需要檢查某個響應是否是你所期望的。
這個需求可以通過scrapy.shell.inspect_response函數進行實現
以下是一個關於如何從spider中調用scrapy shell的例子
[python] view plain
from scrapy.spider import Spider
class MySpider(Spider):
name = "myspider"
start_urls = [
"http://example.com",
"http://example.org",
"http://example.net",
]
def parse(self, response):
# We want to inspect one specific response.
if ".org" in response.url:
from scrapy.shell import inspect_response
inspect_response(response)
# Rest of parsing code.
當你啟動爬蟲的時候,控制台將列印出類似如下的信息
[python] view plain
2014-02-20 17:48:31-0400 [myspider] DEBUG: Crawled (200) <GET http://example.com> (referer: None)
2014-02-20 17:48:31-0400 [myspider] DEBUG: Crawled (200) <GET http://example.org> (referer: None)
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x1e16b50>
...
>>> response.url
'http://example.org'
注意:當Scrapy engine被scrapy shell佔用的時候,Scrapy shell中的fetch函數是無法使用的。 然而,當你退出Scrapy shell的時候,蜘蛛將從停止的地方繼續爬行
5. python執行shell命令
Python執行Linux系統命令,即在Python腳本中調用Shell命令,具體有以下四種方法:
1、os.system
//僅僅在一個子終端運行系統命令,而不能獲取命令執行後的返回信息
system(command)->exit_status
Executethecommand(astring)inasubshell.
//如果再命令行下執行,結果直接列印出來:
>>>os.system('ls')
04101419778.CHMbashdocumentmediapy-djangovideo
11.
all-
2、os.popen
//該方法不但執行命令還返回執行後的信息對象
popen(command[,mode='r'[,bufsize]])->pipe
Openapipeto/.
3、使用模塊 subprocess
>>>importsubprocess
>>>subprocess.call(["cmd","arg1","arg2"],shell=True)
//獲取返回和輸出:
importsubprocess
p=subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
forlineinp.stdout.readlines():
printline,
retval=p.wait()
4、使用模塊 commands
>>>importcommands
>>>dir(commands)
['__all__','__builtins__','__doc__','__file__','__name__','getoutput','getstatus','getstatusoutput','mk2arg','mkarg']
>>>commands.getoutput("date")
'WedJun1019:39:57CST2009'
>>>
>>>commands.getstatusoutput("date")
(0,'WedJun1019:40:41CST2009')
6. 我希望通過Python腳本實現多次執行shell命令
python腳本實現多次循環執行shell命令有三種方法,代碼如下:
#方法一
os.system
importos
i=0
whileTrue:
i=i+1
os.system("tcpreplay-ibond0-M5-l1oracle_request_response.cap")
print"+++++++++++++++++++++++++++++++"
print"times:",i
time.sleep(5)
#方法二
os.popen
importos
i=0
whileTrue:
i=i+1
printos.popen("tcpreplay-ibond0-M5-l1oracle_request_response.cap").read()
print"+++++++++++++++++++++++++++++++"
print"times:",i
time.sleep(60)
#方法三
output=Popen("xxx",shell=True).communicate()[0]
importos
fromsubprocessimport*
i=0
whileTrue:
i=i+1
output=Popen("tcpreplay-ibond0-M5-l1oracle/*",shell=True).communicate()[0]
print"+++++++++++++++++++++++++++++++"
print"times:",i
time.sleep(60)
7. Python利用input和eval函數實現一個簡單的Shell
while激或True:
command=input()
飢鉛汪爛仔print(eval(command))
8. python執行shell函數嗎
python可以通過以下方式執行shell命令
importos
#linux環境下在用戶目錄下創建test.tmp文件夾
os.popen('mkdir~/test.tmp')
9. python shell怎麼使用
Python 中執行 Shell 命令有多種方法,stackoverflow 上有對這些方法進行比較的討論,Calling an external command in Python 指出使用subprocess模塊來實現更優。因此,本文說明如何使用subprocess模塊來實現 Shell 腳本的功能。
subprocess模塊提供多種方法來實現執行 Linux 的命令,例如subprocess.call()方法,subprocess.check_call()方法,等。這些方法都是對Popen類的封裝,故本文著重講述Popen類的使用。
執行 Shell 命令
可以通過向Popen()傳遞需要執行的命令來創建一個Popen對象,這樣,便會創建一個子進程來執行命令。例如:
child = subprocess.Popen(["ping","-c","5","leehao.me"])
1
上面的代碼會創建一個子進程來執行ping -c 5 leehao.me命令,這個命令採用列表的形式傳遞給Popen()方法。如果我們想直接採用ping -c 5 leehao.me字元串形式,可以添加shell=True來實現:
child = subprocess.Popen("ping -c 5 leehao.me", shell=True)
1
官方文檔指出由於安全原因故不建議使用shell=True,詳細說明可以參考官方文檔的描述。
等待子進程執行
子進程執行命令後,主進程並不會等待子進程執行。為了讓主進程等待子進程執行結束,需要顯示調用Popen.wait()方法。例如:
child = subprocess.Popen(["ping","-c","5","leehao.me"])
child.wait()
print 'parent finish'
1
2
3
這樣,主進程會等待子進程執行ping命令完畢後,才會列印出parent finish的輸出。
獲取執行結果
為了獲取Popen()子進程的輸出,可以使用Popen.communicate()方法,例如:
def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
proc_stdout = process.communicate()[0].strip()
print proc_stdout
subprocess_cmd('echo leehao.me; echo www.leehao.me')
1
2
3
4
5
6
輸出:
leehao.me
www.leehao.me
process.communicate()方法可以實現主進程與子進程的通信。主進程可以通過它向子進程發送數據,也可以讀取子進程的輸出的數據。上面的例子中,我們在創建Popen對象時指定stdout=subprocess.PIPE,這樣主進程便可以讀取子進程的輸出。
communicate()方法返回一個元組:(stdoutdata, stderrdata),process.communicate()[0]即獲取子進程的標准輸出。
需要指出的是,調用communicate()方法後,主進程也會等待子進程執行完畢。
上面的例子中,子進程向標准輸出列印兩個字元串,主進程接收到了這些輸出,並列印出來。
10. 如何在Pythonshell界面中執行編寫好的.py文件
1.打開我們的Pythonshell界面基悶,。
2.編寫一個.py文件,相信用到這個技巧的小夥伴們已經會建立工程了吧,這里建立了一個溫度單位轉換腳本。將文件名保存成「TempConvert」。
3.常規的執行方法,我們通常會單擊「run」-「runmole」來實現我們的代碼執行。
4.回到界面shell界面中,我們輸入一下代碼:importTempConvert,其基本格式是:import腳本文件名,注意我們的腳本文件要和Python.exe放在同一坦漏個目錄下。
5.這樣我們就搏信彎可以執行我們的代碼了,如下我們剛才腳本的實現效果是杠桿地,注意我們的腳本的目錄一定保存正確。