相关疑难解决方法(0)

为什么不在Python的subprocess.Popen中使用`shell = True`?

我有一个很长的单行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)如果我必须以"第一路"写作(因为它写得更快),我怎么能避免这样的抱怨 …

python linux shell subprocess process

3
推荐指数
1
解决办法
4191
查看次数

python子进程和mysqldump

我知道之前已经问过这个问题的部分内容,但我有一些相关的问题.

我正在尝试执行

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 subprocess mysqldump

2
推荐指数
1
解决办法
5007
查看次数

如何在Python中使用mysqldump和mysql复制数据库?

我正在编写一个简单的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)

python mysql subprocess mysqldump pymysql

2
推荐指数
3
解决办法
2万
查看次数

Python - 带引号和管道 Grep 的子进程

我在尝试将简单的 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 subprocess

1
推荐指数
1
解决办法
7005
查看次数

python + 使用变量运行系统命令

我需要从 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 linux python-2.4

0
推荐指数
1
解决办法
5534
查看次数

标签 统计

python ×5

subprocess ×4

linux ×2

mysqldump ×2

mysql ×1

process ×1

pymysql ×1

python-2.4 ×1

shell ×1