小编Eev*_*vee的帖子

subprocess.call使用字符串vs使用列表

我试图使用rsync与subprocess.call.奇怪的是,如果我传递subprocess.call一个字符串,它可以工作,但它不适用于列表(ala,Python的doc).

使用字符串调用sp.call:

In [23]: sp.call("rsync -av content/ writings_raw/", shell=True)
sending incremental file list

sent 6236 bytes  received 22 bytes  12516.00 bytes/sec
total size is 324710  speedup is 51.89
Out[23]: 0
Run Code Online (Sandbox Code Playgroud)

使用列表调用sp.call:

In [24]: sp.call(["rsync", "-av", "content/", "writings_raw/"], shell=True)
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes …
Run Code Online (Sandbox Code Playgroud)

python subprocess

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

如何在wsgi中启动pdftk子进程?

我需要在Django中提供Web请求时启动pdftk进程,并等待它完成.我目前的pdftk代码如下所示:

proc = subprocess.Popen(["/usr/bin/pdftk", 
                         "/tmp/infile1.pdf", 
                         "/tmp/infile2.pdf", 
                         "cat", "output", "/tmp/outfile.pdf"])    
proc.communicate()
Run Code Online (Sandbox Code Playgroud)

只要我在开发服务器(以用户身份运行www-data)下执行,这样就可以正常工作.但是一旦我切换到mod_wsgi,不改变其他任何东西,代码挂起proc.communicate(),并且"outfile.pdf"保留为零长度的打开文件句柄.

我已经尝试了几个子进程调用的变种(以及普通的旧的os.system) - 将stdin/stdout/stderr设置为PIPE或各种文件句柄没有任何改变.使用"shell = True"可以防止proc.communicate()挂起,但是pdftk无法在devserver或mod_wsgi下创建输出文件. 这个讨论似乎表明可能存在一些更深层次的巫术信号和我不理解的pdftk.

是否有任何变通方法可以让这样的子进程调用在wsgi下正常工作?我正在避免使用PyPDF来组合pdf文件,因为我必须组合足够大量的文件(数百个),这些文件耗尽了内存(PyPDF需要在组合它们时保持每个源pdf文件在内存中打开).

我在最近的Ubuntu,pythons 2.6和2.7下做这个.

python django subprocess mod-wsgi pdftk

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

subprocess.Popen 的输出

我一直在写一些 python 代码,在我的代码中我使用了“命令”

该代码按我的预期工作,但后来我在 Python 文档中注意到该命令已被弃用,并将在 Python 3 中删除,我应该改用“子进程”。

“好吧”我想,“我不希望我的代码直接进入遗留状态,所以我现在应该改变它。

问题是 subprocess.Popen 似乎在任何输出的开头添加了一个讨厌的字符串,例如

<subprocess.Popen object at 0xb7394c8c>
Run Code Online (Sandbox Code Playgroud)

我看到的所有例子都在那里,它似乎被接受,因为它总是在那里。

这段代码;

#!/usr/bin/python
import subprocess
output = subprocess.Popen("ls -al", shell=True)
print output
Run Code Online (Sandbox Code Playgroud)

产生这个;

<subprocess.Popen object at 0xb734b26c>
brettg@underworld:~/dev$ total 52
drwxr-xr-x  3 brettg brettg 4096 2011-05-27 12:38 .
drwxr-xr-x 21 brettg brettg 4096 2011-05-24 17:40 ..
<trunc>
Run Code Online (Sandbox Code Playgroud)

这是正常的吗?如果我将它用作将各种格式化详细信息输出到控制台的较大程序的一部分,它会将一切搞砸。

我正在使用该命令通过使用 ifconfig 以及各种 grep 和 awks 来获取接口的 IP 地址来抓取地址。

考虑这个代码;

#!/usr/bin/python
import commands,subprocess

def new_get_ip (netif):
address = subprocess.Popen("/sbin/ifconfig " + netif + " | …
Run Code Online (Sandbox Code Playgroud)

python subprocess

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

一起使用gevent和多处理来与子进程通信

题:

我可以在Windows上以高效的方式将多处理模块与gevent一起使用吗?

场景:

我有一个基于gevent的Python应用程序在Windows上进行异步I/O. 该应用程序主要受I/O限制,但也存在CPU负载较高的峰值.此应用程序需要通过其stdin和stdout控制控制台应用程序.我无法修改此控制台应用程序,用户将能够使用自己的自定义应用程序,只修复基于文本(行)的通信协议.

我有一个使用子进程和线程的工作实现,但我宁愿将整个基于子进程的通信代码与这些线程一起移动到一个单独的进程中,以将主应用程序转回单线程.我打算为此使用多处理模块.

事先阅读:

我一直在网上搜索并阅读一些源代码,所以我知道多处理模块在Windows上使用基于命名管道的Pipe实现.一对multiprocessing.queue.Queue对象将用于与第二个Python进程通信.这些队列基于该管道实现,例如IPC将通过命名管道完成.

关键问题是,调用传入的Queue的get方法是否会阻止gevent的主循环.该方法有一个超时,所以我可以把它变成一个带有小超时的循环,但这不是一个好的解决方案,因为它会在很短的时间内阻止gevent,从而损害其低I/O延迟.

我也对如何规避在Windows上使用管道的整个问题的建议持开放态度,这已知很难,有时甚至是脆弱的.我不确定在Windows上是否可以使用基于共享内存的IPC.也许我可以用一种允许使用网络套接字与子进程通信的方式来包装控制台应用程序,这已知可以与gevent一起使用.

如果可能的话,请不要质疑我的主要用例.谢谢.

windows subprocess asynchronous multiprocessing gevent

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

Python subprocess.Popen 结果存储在变量中

我看过关于此的各种其他帖子,但不幸的是我仍然无法弄清楚:

如果我做这样的事情:

temp = subprocess.Popen("whoami", shell=True, stdout=subprocess.PIPE)
out = temp.communicate()
print(out)
Run Code Online (Sandbox Code Playgroud)

然后我得到一些形式的东西

(b'username\n', None)
Run Code Online (Sandbox Code Playgroud)

通过其他尝试(例如添加 .wait()),我在一行上获取了用户名,并在下一行上获取了 0 作为返回码,但是只有 0 存储在我的变量中。

有没有一种简单的方法可以将其格式化以仅将用户名存储在变量中?我尝试了类似 out[3:11] 的方法,但没有成功。

谢谢

subprocess python-3.x

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

在使用没有shell的subprocess.call时,如何将字符串传递给脚本

我在用

subprocess.call(['prog', 'arg'], shell=False)
Run Code Online (Sandbox Code Playgroud)

执行编程并让我自己逃避arg.

现在有时候prog需要来自STDIN的一些输入.在我可以使用的shell中

echo 'some input' | prog arg
Run Code Online (Sandbox Code Playgroud)

用管子.如何在不自动转义arg的情况下使用子进程执行此操作?这甚至可能吗?

或者是唯一的方法

subprocess.call('echo "%s" | prog "%s"' % ('some input', 'arg'), shell=True)
Run Code Online (Sandbox Code Playgroud)

这根本不安全.

python subprocess

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

如何使用python在Ubuntu终端中保存来自"sudo dpkg -l"的数据

如何使用python在Ubuntu终端中保存来自"sudo dpkg -l"的数据,我试着这样做,但是它不起作用

import os
f = open('/tmp/dpgk.txt','w')
f.write(os.system('sudo dpkg -l'))
Run Code Online (Sandbox Code Playgroud)

python subprocess

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

要求用户在Python中输入正确的响应?

我是一名新手程序员,我正在尝试编写一个程序,我要求用户提供像奥巴马,克林顿或布什这样的特定输入,并在他们给出正确答案时向他们表示祝贺,或在他们给出错误答案时通知他们.

我很确定我犯了一个非常简单和愚蠢的错误,所以如果有人能帮助我,我会很感激.

def main ():

    pres = input ('Please enter the surname of a recent President of the United States: ')
    if pres == 'Bush' or 'Obama' or 'Clinton':
        print('Great job! You know your stuff!')
    else:
        print('Sorry, that was incorrect.')

main()
Run Code Online (Sandbox Code Playgroud)

谢谢!

python python-3.x

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