我有一个需要执行外部程序的Python脚本,但由于某种原因失败了.
如果我有以下脚本:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Run Code Online (Sandbox Code Playgroud)
然后它失败并出现以下错误:
'C:\ Temp\a'不被识别为内部或外部命令,可操作程序或批处理文件.
如果我用引号来逃避程序:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Run Code Online (Sandbox Code Playgroud)
然后它工作.但是,如果我添加一个参数,它会再次停止工作:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Run Code Online (Sandbox Code Playgroud)
执行程序并等待程序完成的正确方法是什么?我不需要从中读取输出,因为它是一个可视化程序,可以完成工作然后退出,但我需要等待它完成.
另请注意,将程序移动到非间隔路径也不是一种选择.
这也不起作用:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Run Code Online (Sandbox Code Playgroud)
注意交换的单/双引号.
在此处有或没有记事本参数,它会失败并显示错误消息
文件名,目录名或卷标语法不正确.
可能重复:
在Python中调用外部命令
我正在构建一个Web应用程序,它将操纵(填充,混合,合并等)声音文件,我发现sox完全符合我的要求.Sox是一个linux命令行程序,让我感到有点不舒服的是让python web应用程序在我的服务器上基于每个请求启动新的sox进程.
例:
import os
os.system('sox input.wav -b 24 output.aiff rate -v -L -b 90 48k')
Run Code Online (Sandbox Code Playgroud)
整个设置对我来说似乎有点不稳定.
所以我的问题是,在python(或任何脚本语言)Web应用程序中运行命令行程序的最佳实践是什么?
为了绕过整个请求响应周期,消息队列将是一件要实现的事情.但还有其他方法可以让这些东西更优雅吗?
我正在尝试将shell脚本移植到更易读的python版本.原始shell脚本在后台使用"&"启动多个进程(实用程序,监视器等).如何在python中实现相同的效果?我希望这些进程不会在python脚本完成时死掉.我确信它与守护进程的概念有某种关系,但我无法轻易找到如何做到这一点.
我用subprocess模块调用不同的进程.但是,我有一个问题.
在以下代码中:
callProcess = subprocess.Popen(['ls', '-l'], shell=True)
Run Code Online (Sandbox Code Playgroud)
和
callProcess = subprocess.Popen(['ls', '-l']) # without shell
Run Code Online (Sandbox Code Playgroud)
两者都有效.阅读文档后,我开始知道这shell=True意味着通过shell执行代码.这意味着在缺席的情况下,该过程将直接启动.
那么我应该更喜欢我的情况 - 我需要运行一个进程并获得其输出.从shell内部或外部调用它有什么好处.
我想在python中执行curl命令.
通常,我只需要在终端输入命令并按回车键.但是,我不知道它在python中是如何工作的.
该命令如下所示:
curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere
Run Code Online (Sandbox Code Playgroud)
有一个request.json文件要发送以获得响应.
我经常搜索并感到困惑.我试着写一段代码,虽然我无法完全理解.它没用.
import pycurl
import StringIO
response = StringIO.StringIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://www.googleapis.com/qpxExpress/v1/trips/search?key=mykeyhere')
c.setopt(c.WRITEFUNCTION, response.write)
c.setopt(c.HTTPHEADER, ['Content-Type: application/json','Accept-Charset: UTF-8'])
c.setopt(c.POSTFIELDS, '@request.json')
c.perform()
c.close()
print response.getvalue()
response.close()
Run Code Online (Sandbox Code Playgroud)
错误信息是'Parse Error'.任何人都可以告诉我如何修复它?或者如何正确地从服务器获得响应?
我需要从Python脚本异步运行shell命令.通过这个我的意思是我希望我的Python脚本在外部命令关闭时继续运行并执行它需要做的任何事情.
我看过这篇文章:
然后我os.system()去做了一些测试,看起来我会&在命令结束时使用它来完成工作,这样我就不必等待它返回了.我想知道的是,这是否是实现这一目标的正确方法?我试过commands.call()但它对我不起作用,因为它阻止了外部命令.
如果使用os.system()这个是可取的,或者我应该尝试其他路线,请告诉我.
我刚刚开始研究Python,我一直在尝试从Python运行外部可执行文件.
我有一个用Fortran编写的程序的可执行文件.假设可执行文件的名称是flow.exe.我的可执行文件位于C:\Documents and Settings\flow_model.我尝试了os.system和popen命令,但到目前为止我无法使其工作.以下代码似乎打开命令窗口,但它不会执行模型.
# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
假设有一个脚本做这样的事情:
# module writer.py
import sys
def write():
sys.stdout.write("foobar")
Run Code Online (Sandbox Code Playgroud)
现在假设我想捕获write函数的输出并将其存储在变量中以供进一步处理.天真的解决方案是:
# module mymodule.py
from writer import write
out = write()
print out.upper()
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我想出了另一个解决方案并且它有效,但是请告诉我是否有更好的方法来解决问题.谢谢
import sys
from cStringIO import StringIO
# setup the environment
backup = sys.stdout
# ####
sys.stdout = StringIO() # capture output
write()
out = sys.stdout.getvalue() # release output
# ####
sys.stdout.close() # close the stream
sys.stdout = backup # restore original stdout
print out.upper() # post processing
Run Code Online (Sandbox Code Playgroud) 我想访问shell命令的结果:
youtube-dl -g "www.youtube.com..."
Run Code Online (Sandbox Code Playgroud)
将其输出打印direct url到文件; 从python程序中:
import youtube-dl
fromurl="www.youtube.com ...."
geturl=youtube-dl.magiclyextracturlfromurl(fromurl)
Run Code Online (Sandbox Code Playgroud)
那可能吗 ?我试图了解源的机制,但迷路了:youtube_dl/__init__.py,youtube_dl/youtube_DL.py,info_extractors...
我试图在python脚本中执行curl命令.
如果我在终端中这样做,它看起来像这样:
curl -X POST -d '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}' http://localhost:8080/firewall/rules/0000000000000001
Run Code Online (Sandbox Code Playgroud)
我已经看过要使用的建议pycurl,但我无法弄清楚如何将它应用到我的.
我试过用:
subprocess.call([
'curl',
'-X',
'POST',
'-d',
flow_x,
'http://localhost:8080/firewall/rules/0000000000000001'
])
Run Code Online (Sandbox Code Playgroud)
它有效,但还有更好的方法吗?
python ×10
curl ×2
subprocess ×2
asynchronous ×1
command-line ×1
daemon ×1
executable ×1
process ×1
pycurl ×1
python-2.7 ×1
scheduler ×1
shellexecute ×1
stdout ×1
sys ×1
youtube-dl ×1