我试图通过subprocess.Popen运行控制台命令,每当我运行它时,即使运行 echo 命令,我也会收到 Windows“文件未找到”错误。我还在使用 thread 模块创建的线程中使用 Popen。这是问题所在吗?
我正在使用popen4来捕获stdout,stderr和命令行的退出状态.只要我能抓住上述三件事,我就不会受到popen4的束缚.目前我还没有找到捕获命令未找到错误的好方法.我想which cmd在一个预先任务中做一个,但希望内置一些东西.
在下面你可以运行一个好的任务,糟糕的任务和一个虚假的任务来查看差异.我正在以新鲜rails new app的popen4宝石做这件事
#!/usr/bin/env rake
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
require 'open4'
# returns exit status 0, all is good
task :convert_good do
puts "convert good"
`wget https://www.google.com/images/srpr/logo3w.png`
status = Open4.popen4("convert logo3w.png output.jpg") do |pid, stdin,stdout,stderr|
stdin.close
puts "stdout:"
stdout.each_line { |line| puts line }
puts "stderr: #{stderr.inspect}"
stderr.each_line …Run Code Online (Sandbox Code Playgroud) 我正在使用蟒蛇。我正在尝试运行一个进程并使用 subprocess.popen 获取输出。在阅读之后,我看到人们使用了communication()[0] 但这不在文档中,它在一个示例中使用。我想知道是否有人可以告诉我为什么要附加 [0] 到communication()?
我试图让Python来发送EOF信号(Ctrl+ DVIA) Popen()。不幸的是,我Popen()在 *nix-like 系统上找不到任何类型的信号参考。这里有人知道如何发送这样的EOF信号吗?另外,是否有任何关于要发送的可接受信号的参考?
我正在将此 bash 脚本转换为 Python。我现在有一个可以运行的 Python 版本。然而,为了让它工作,我必须修改传递给 subprocess.Popen() 的命令,将其变成一个长字符串。 我不想使用一长串命令。我希望将其分解为适当的单独参数。在这个具体的例子中我该如何做到这一点?
我的具体问题是如何更改这一行:
process = subprocess.Popen(cmd, shell=True, ...
Run Code Online (Sandbox Code Playgroud)
变成这样的形式:
process = subprocess.Popen([prog, inf, arate, outf], shell=False, ...
Run Code Online (Sandbox Code Playgroud)
这是我的完整代码,以便上面的片段有意义:
#!/usr/bin/env python
import sys
import subprocess
import os.path
import argparse #requires Python 2.7 or above
parser = argparse.ArgumentParser(description='Converts (.M4V) videos into (.MP3) audio files using ffmpeg.')
parser.add_argument('-d','--directory', help='Source directory name',required=True)
parser.add_argument('-o','--output',help='Output directory name', required=False)
parser.add_argument('-a','--arate',help='ffmpeg\'s arate option', default="64K", required=False)
parser.add_argument('-s','--source',help='Input type; e.g., file ext (default .m4v)', default=".m4v", required=False)
parser.add_argument('-e','--ext',help='Output …Run Code Online (Sandbox Code Playgroud) 目标。启动 django 框架时,也会启动其他依赖 django 对象的 PY 脚本。从配置文件中获取服务器和端口号。
问题:Popen 似乎运行了两次,我不知道为什么?
#!/usr/bin/env python
import os
import sys
import subprocess
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test.localsettings")
from django.core.management import execute_from_command_line
def getargs():
try:
f = open("config")
data = []
for line in f:
data.append(line)
f.close()
server = data[0].rstrip()
port = data[1]
newargs = ['lmanage.py', 'runserver', server + ':' + port]
return newargs
except Exception as e:
print e
pass
if __name__ == "__main__":
#Launching Checker
try:
checker = subprocess.Popen([sys.executable, os.path.join(os.getcwd() + "checker.py")], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
print checker.pid …Run Code Online (Sandbox Code Playgroud) 因此,如果我在gcc stdio.h中使用popen(),我可以将父级的stdout传递给其子级的stdin,或者我可以将子级的stdout传递给父级的stdin.我想同时做两件事.有没有办法使用popen来做到这一点,或者我是否需要使用较低级别的工具(如共享内存)来完成这项工作?
注意:在FreeBSD中看起来popen可以用"r +"进行读写.我不明白孩子的stdout是如何通过管道输送到父母和父母的标准输出.不管怎么说,这可能对我有用,但在Linux中似乎并非如此.如果我在这一点上弄错了,那就会回答我的问题.以下是我收到此说明的链接:https://www.freebsd.org/cgi/man.cgi?query = popen&sektion = 3
注2:我更喜欢按照优先顺序在几乎所有Linux发行版,FreeBSD和OSX上移植的解决方案.话虽这么说,我很乐意至少让它在Ubuntu 14.04中运行.
我有一个使用 subprocess.Popen 打开文件的脚本,这样我就可以在后台运行它。我希望能够使用 ./[script] [params] 运行此脚本
#!/usr/bin/python
import subprocess
import sys
sys.path.insert(0,"./pyqt")
import gui
if __name__ == "__main__":
subprocess.Popen(["python", "./pyqt/gui.py"])
Run Code Online (Sandbox Code Playgroud)
gui.py 可以使用 sys.argv 从终端运行时获取参数。下面是我如何在 gui.py 中访问这些参数
def main(*args):
print(args)
if __name__ == "__main__":
main(sys.argv)
Run Code Online (Sandbox Code Playgroud)
如何将 sys.argv 传递到 subprocess.Popen 中?
我在找出如何使用popen()将标准输出从 Linux 中的子程序获取到主 C++ 程序时遇到了麻烦。我环顾四周,发现这段代码可以完成我想要它做的事情。但我无法理解这些东西是如何工作的。我知道 C++ 编程的基础知识(我已经做了几个月了)但是我很困惑所以有人可以帮我解释一下吗?
先感谢您。
#include <vector>
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;
void my_popen( const string& cmd ,vector<string>& out ){
FILE* fp;
const int sizebuf=1234;
char buff[sizebuf];
out = vector<string> ();
if ((fp = popen (cmd.c_str (), "r"))== NULL){
}
string cur_string = "";
while (fgets(buff, sizeof (buff), fp)) {
cur_string += buff;
}
out.push_back (cur_string.substr (0, cur_string.size() -1));
pclose(fp);
}
int main () {
vector<string> output;
my_popen("which driftnet", output);
for …Run Code Online (Sandbox Code Playgroud) 在 popen() 之后,fread() 总是返回 0。将 read() 与 fileno(fp) 一起使用是可行的。这是怎么回事?
这是代码。
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
FILE *fp = popen("echo hello", "r");
if (!fp) {
perror("echo hello");
} else {
char buffer[128];
for (;;) {
int n;
if (argc < 2) {
n = fread(buffer, sizeof buffer, 1, fp);
} else {
n = read(fileno(fp), buffer, sizeof buffer);
}
printf("read %d bytes\n", n);
if (n <= 0) break;
fwrite(buffer, n, 1, stdout);
}
pclose(fp); …Run Code Online (Sandbox Code Playgroud)