我正在使用Python的subprocess.Popen使用主机操作系统的二进制客户端执行一些FTP。由于各种原因,我无法使用ftplib或任何其他库。
如果我将stdin处理程序附加到Popen实例,则二进制文件的行为似乎会改变。例如,使用XP的ftp客户端,该客户端接受发出命令的文本文件:
>>>from subprocess import Popen, PIPE
>>>p = Popen(['ftp','-A','-s:commands.txt','example.com'], stdout=PIPE)
>>>p.communicate()[0]
'Connected to example.com.
220 ProFTPD 1.3.1 Server (Debian) ...
331 Anonymous login ok, send your complete email address as your password
<snip>
ftp> binary
200 Type set to I
ftp> get /testfiles/100.KiB
200 PORT command successful
150 Opening BINARY mode data connection for /testfiles/100.KiB (102400 bytes)
226 Transfer complete
ftp: 102400 bytes received in 0.28Seconds 365.71Kbytes/sec.
ftp> quit
>>>
commands.txt:
binary
get /testfiles/100.KiB
quit
当还提供stdin时,您在stdout中获得的全部就是:
>>>from subprocess import Popen, PIPE
>>>p = Popen(['ftp','-A','-s:commands.txt','example.com'], stdin=PIPE, stdout=PIPE)
>>>p.communicate()[0]
'binary
get /testfiles/100.KiB
quit'
>>>
最初我以为这是XP ftp客户端的怪癖,也许知道它不是处于交互模式,因此限制了它的输出。但是,OS X的ftp也会发生相同的行为-
如果提供了stdin,则stdout会丢失所有服务器响应-这使我认为这是正常的行为。
在Windows中,我可以使用-s开关来有效地编写ftp脚本,而无需使用stdin,但是在其他平台上,这种交互取决于外壳程序。
在两个平台上,Python版本均为2.6.x。为什么为stdin提供句柄会更改stdout,并且服务器响应会发送到哪里?
我想我在某个地方(但不记得在哪里)读到Windows ftp客户端来自原始BSD实现之一。这样肯定会与Mac OS X的ftp实现共享一些关系。
对我而言,这与Popen无关,而与客户端ftp程序实现有关,后者使用isatty(3)作为启动程序的启动上下文进行检查(以查看它是与人类脚本还是与Shell脚本交互)。在回答中提到了伊格纳西奥。对于可以在两种情况下使用的程序,这都是惯例。一个著名的示例是
–color = auto选项的GNU
grep实现:仅当stdout是tty时,它才会着色输出,而如果grep的输出通过管道传递到另一个命令中,则不会着色。
问题内容: 我正在编写一个使用subprocess.Popen的python脚本,以执行两个程序(来自已编译的C代码),每个程序都生成stdout。该脚本获取该输出并将其保存到文件中。因为有时输出的大小足以淹没subprocess.PIPE,导致脚本挂起,所以我将stdout直接发送到日志文件。我想让我的脚本在文件的开头和结尾以及两个subprocess.Popen调用之间写入一些内容。但是,当我
问题陈述 输入格式 有三行输入: 第一行包含一个整数。 第二行包含double。 第三行包含字符串。 null 为了使问题更容易,编辑器中已经提供了一部分代码。 注意:如果您在nextInt()方法之后立即使用nextLine()方法,请回想一下nextInt()读取整数令牌;因此,这一行整数输入的最后一个换行符仍在输入缓冲区中排队,下一个nextLine()将读取整数行的剩余部分(为空)。 样本
我正在玩rxjava,发现如果在活动被销毁之前没有完成订阅,则存在内存泄漏的风险,因为“可观察对象保留对上下文的引用”。如果订阅没有取消订阅,则此类情况的演示之一如下所示。已销毁(来源:https://github.com/dlew/android-subscription-leaks/blob/master/app/src/main/java/net/danlew/rxsubscriptions
问题内容: 此代码 运行约30秒后给出此错误消息 而这段代码 几乎可以立即完美运行,并产生10MB的文件。据我了解,流的要点是两个版本应该在大约相同的时间内运行,因为数据是相同的。即使每次迭代将s 的数量增加到100或1000,也几乎不会增加运行时间,并且写入1GB文件没有任何问题。在1e6次迭代中每次迭代编写一个字符也可以正常工作。 这里发生了什么? 问题答案: 发生内存不足错误是因为您没有等待
问题内容: 如果我使用列表推导方法执行操作,它将写入局部变量: 打印“ 9”。但是,如果使用生成器,则它不会写入局部变量: 打印“ 0”。 有什么很好的理由可以做到这一点吗?这是设计决定,还是只是生成器和列表理解的实现方式的随机副产品?就个人而言,如果列表推导不写入局部变量,对我来说似乎更好。 问题答案: Python的创建者Guido van Rossum在写关于统一内置在Python 3中的生
问题内容: 我正在尝试运行一个应用程序(例如),因此它将从文件中读取stdin并从stdout写入另一个文件。 目前我有 它可以按预期工作,因为我可以对该文件进行某些操作,并且top可以接收它。但是我无法重定向top的输出。我该如何实现? 编辑: 好吧,让我们从头开始。我正在测试: 问题答案: 让我们忘掉这似乎是一条红色的鲱鱼。 要将stdin或stdout映射到文件,可以使用重定向: 甚至: