我有一个很长的单行shell命令可以被Python调用.代码是这样的:
# "first way"
def run_cmd ( command ):
print "Run: %s" % command
subprocess.call (command, shell=True)
run_cmd('''sort -n -r -k5 {3} |head -n 500|awk 'OFS="\t"{{if($2-{1}>0){{print $1,$2-{1},$3+{1},$4,$5}}}}' > {2}'''.format(top_count,extend/2,mid,summit))
Run Code Online (Sandbox Code Playgroud)
这些代码有效,但总是这样抱怨:
sort: write failed: standard output: Broken pipe
sort: write error
awk: (FILENAME=- FNR=132) fatal: print to "standard output" failed (Broken pipe)
Run Code Online (Sandbox Code Playgroud)
根据之前的回答,我需要使用更长的脚本来完成此操作,例如:
# "second way"
p1 = Popen("sort -n -r -k5 %s"%summit, stdout=PIPE)
p2 = Popen("head -n 500", stdin=p1.stdout, stdout=PIPE)
# and so on ..........
Run Code Online (Sandbox Code Playgroud)
我的问题是:
(1)"第二路"是否比"第一路"慢
(2)如果我必须以"第一路"写作(因为它写得更快),我怎么能避免这样的抱怨 …
我知道之前已经问过这个问题的部分内容,但我有一些相关的问题.
我正在尝试执行
mysqldump -u uname -ppassword --add-drop-database --databases databaseName | gzip > fileName
Run Code Online (Sandbox Code Playgroud)
我可能会抛弃一个非常大的(200GB?)数据库.这本身就是一件蠢事吗?然后我想通过网络发送压缩文件进行存储,删除本地转储,并清除几个表.
无论如何,我正在使用这样的子进程,因为似乎没有办法在没有子进程的情况下执行整个原始调用 是一个表名:
from subprocess import Popen, PIPE
f = open(FILENAME, 'wb')
args = ['mysqldump', '-u', 'UNAME', '-pPASSWORD', '--add-drop-database', '--databases', 'DB']
p1 = Popen(args, stdout=PIPE)
P2 = Popen('gzip', stdin=p1.stdout, stdout=f)
p2.communicate()
Run Code Online (Sandbox Code Playgroud)
但后来我读到,通信缓存内存中的数据,这对我不起作用.这是真的?
我现在最终做的是:
import gzip
subprocess.call(args, stdout=f)
f.close()
f = open(filename, 'rb')
zipFilename = filename + '.gz'
f2 = gzip.open(zipFilename, 'wb')
f2.writelines(f)
f2.close()
f.close()
Run Code Online (Sandbox Code Playgroud)
当然这需要一百万年,我讨厌它.
我的问题:1.我可以在非常大的数据库上使用我的第一种方法吗?2.我是否可能将mysqldump的输出传输到套接字并通过网络触发并在它到达时保存它,而不是发送压缩文件?
谢谢!
我正在编写一个简单的Python脚本来复制MySQL数据库.我试图根据以下SO问题及其答案复制数据库:" 不使用mysqldump复制/复制数据库 "," python subprocess和mysqldump "和" Python子进程,mysqldump和管道 ".但是,由于某些原因我的脚本无法正常工作,因为表格和数据没有出现在我的新数据库中.
我可以从我的输出中看到mysqldump正常工作(我在输出中看到"转储完成..."),所以我认为我的管道出了问题.
这是我的脚本:
#!/usr/bin/env python
import pymysql
from subprocess import Popen, PIPE, STDOUT
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='mydb')
cur = conn.cursor()
print("Attempting to create new database...")
try:
cur.execute("CREATE DATABASE mydb2")
print("Creating new database")
except Exception:
print("Database already exists")
print()
# close connection just to be sure
cur.close()
conn.close()
print("Trying to copy old database to new database...")
args1 = ["mysqldump", "-h", "localhost", "-P", "3306", "-u", "root", "-p", "mydb"] …Run Code Online (Sandbox Code Playgroud) 我在尝试将简单的 grep 命令输入 python 时遇到问题。我想在文件或列表中获取以下命令的输出。
grep -c 'some thing' /home/user/* | grep -v :0
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的,但它根本不起作用......
thing = str(subprocess.Popen(['grep', '-c', 'some thing', '/home/user/*', '|', 'grep', '-v', ':0'], stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
基本上,我需要搜索目录中的文件,如果目录中的任何文件中缺少我的字符串,则返回结果。
工作代码(谢谢!!):
thing = subprocess.Popen(('grep -c "some thing" /home/user/* | grep -v ":0"' ),shell=True, stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud) 我需要从 python 运行系统命令
我有 python - 版本 - Python 2.4.3
我尝试以下操作,在本例中为ls -ltr | 八月
#!/usr/bin/python
import commands
Month = "Aug"
status,output = commands.getstatusoutput(" ls -ltr | grep Month " )
print output
Run Code Online (Sandbox Code Playgroud)
如何在命令中插入 Month 变量?
所以grep会这样做
| grep Aug
Run Code Online (Sandbox Code Playgroud)
我也试试这个
status,output = commands.getstatusoutput( " ls -ltr | grep {} ".format(Month) )
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误
Traceback (most recent call last):
File "./stamm.py", line 14, in ?
status,output = commands.getstatusoutput( " ls -ltr | grep {} ".format(Month) )
AttributeError: 'str' object has no …Run Code Online (Sandbox Code Playgroud) python ×5
subprocess ×4
linux ×2
mysqldump ×2
mysql ×1
process ×1
pymysql ×1
python-2.4 ×1
shell ×1