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.这样我们就搏信弯可以执行我们的代码了,如下我们刚才脚本的实现效果是杠杆地,注意我们的脚本的目录一定保存正确。