我想为交互式CLI程序(Asterisk CLI)编写一个包装器.
基本上,我需要保持与CLI的交互(包括tab-completion),但我想过滤Asterisk的输出,以便只显示与给定模式匹配的行.
我尝试了一种基于select()的方法,使用popen.popen4并在read_fs中放入asterisk stdout_and_stderr和sys.stdin,但它有点不起作用.
谁能给我一些好的指示?
非常感谢,安德里亚
我有一个ssh脚本,它使用本地密钥登录远程主机 - 没有什么太令人兴奋的了.密钥是passworded,我通常会将其添加到代理以避免提示.
有时我会在代理运行之前运行程序,它会等待解锁短语.在这种情况下,我希望命令完全失败,而不是以交互方式提示.
有人知道是否有这个选项?
我正在尝试在Python 2.7应用程序中实现日志记录,并且发现它非常有用。但是,我已经注意到,以交互方式运行Python时,每个日志记录消息都会打印多次。消息被打印的次数与我之前运行脚本的次数相同,因此似乎在脚本结束时未正确清理记录器(我想)。考虑以下示例:
import sys
import logging
def main(argv=None):
log = logging.getLogger('test')
log.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter("%(message)s"))
log.addHandler(console_handler)
log.info('Starting something...')
log.info('Doing something...')
log.info('Finished something.')
logging.shutdown()
if __name__=='__main__':
sys.exit(main(sys.argv[1:]))
Run Code Online (Sandbox Code Playgroud)
打字
>>> import file.py
>>> file.main()
Run Code Online (Sandbox Code Playgroud)
产生以下内容:
Starting something...
Doing something...
Finished something.
Run Code Online (Sandbox Code Playgroud)
然后file.main()再次输入将产生:
Starting something...
Starting something...
Doing something...
Doing something...
Finished something.
Finished something.
Run Code Online (Sandbox Code Playgroud)
重复第三次将给出三个或每个消息,依此类推。有谁知道为什么会这样-这是日志记录模块的预期行为吗?如果是这样,我该如何更改?如果python file.py按预期方式运行,上述脚本仅显示每个消息之一。
是否有可能使用代码"r"编写一个具有附加可选参数的交互式defun(以便它在所选区域内执行某些操作,但使用另一个参数)?我想要以下内容:
(defun my-function (start end &optional arg)
"Do something with selected region"
(interactive "r")
(if arg
(setq val arg)
(setq val 2))
(do things...))
Run Code Online (Sandbox Code Playgroud)
看一下它说的文档
'r':点和标记,作为两个数字参数,最小的第一个.这是唯一一个指定两个连续参数而不是一个参数的代码字母.没有I/O.
我不确定'No I/O'和'两个连续的参数'是否意味着它需要2个且只有2个参数(即,仅限于区域的起点和终点作为args).虽然它允许我用额外的参数来评估和运行defun,但Emacs似乎忽略了它.
谢谢.
我有一个像这样设置的结构任务:
@task
def cli():
command = [
os.path.join(env.servers_path, "bin", "redis-cli"),
]
run(" ".join(command))
Run Code Online (Sandbox Code Playgroud)
运行它会给我一个提示,但没有交互性:
$ fab cli
[server] Executing task 'cli'
[server] Executing task 'redis.cli'
[server] run: /path/to/bin/redis-cli
[server] out: redis 127.0.0.1:6379> help
<no output produced>
Run Code Online (Sandbox Code Playgroud)
键入进一步会产生一个“out:”提示,我在上面键入,但我从来没有从 redis 得到任何东西。
但是,如果我更改为其他一些交互式提示,我确实会获得交互性:
@task
def cli():
command = [
"python"
]
run(" ".join(command))
Run Code Online (Sandbox Code Playgroud)
产生:
$ fab cli
[server] Executing task 'cli'
[server] run: python
[server] out: Python 2.4.3 (#1, Sep 3 2009, 15:37:37)
[server] out: [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2 …Run Code Online (Sandbox Code Playgroud) 我想用菜单创建交互式Python脚本(可能使用curses?),用户可以使用键盘箭头在菜单上导航.实现此类功能的最简单方法是什么?任何简单的用法/教程?谢谢!
我想使用 Qt 和 C++ 制作这样的交互式图形:http : //jsxgraph.uni-bayreuth.de/wiki/index.php/Cubic_spline_interpolation
关于如何做到这一点的任何线索?
编辑:好的,我已经尝试过 QGraphicsView 类和 qwt 库。然而,我发现没有简单的方法来引入交互性。有没有一种简单的方法可以做到这一点?
我需要能够在远程设备上创建一个进程并使用 PowerShell 脚本向它发送命令。我需要这样做,因为我在使用命令时会收到提示。我一直试图通过使用 Google 搜索和以下链接来弄清楚如何做到这一点:http : //tartarus.org/~simon/putty-snapshots/htmldoc/Chapter7.html#plink。通过该链接,我意识到在 Plink 中使用带有命令列表的文件将不起作用,原因如下(从该链接复制并粘贴):
您可以在服务器命令行上有效运行的任何非交互式命令,您都可以通过这种方式使用 Plink 在批处理文件中运行。
它说“非交互式命令”,这就是我正在使用的。无论如何,我也尝试使用带有命令列表的文件,但它并没有解决我的问题,因为我基本上需要发出一个命令,等待,然后在提示我时再给出一个。这是我在PuTTY 常见问题解答中找到的内容,基本上是我想尝试的内容:
可能你最好的选择是使用命令行连接工具 Plink。如果您可以将 Plink 作为第二个 Windows 进程启动,并安排您的主进程能够通过管道向 Plink 进程发送数据并从中接收数据,那么您应该能够从您的程序建立 SSH 连接。例如,这就是 CVS for Windows 所做的。
编辑:根据 user2460798 的回答,我尝试了下面的解决方案。我希望使用 PuTTY 并能够以这种方式向它发送命令。我现在的问题是我不知道如何向打开的 PuTTY 会话发送命令。所以基本上这段代码打开了一个 PuTTY 会话并尝试向它写入“ls”命令,但没有任何反应。我不知道“ls”文本的去向。
$procInfo = New-Object Diagnostics.ProcessStartInfo
$procInfo.RedirectStandardOutput=$true
$procInfo.RedirectStandardInput=$true
$procInfo.RedirectStandardError=$true
$procInfo.FileName="putty.exe"
$procInfo.Arguments="-ssh -pw <password> <username>@<device>"
$procInfo.UseShellExecute=$false
$p=[diagnostics.process]::start($procInfo)
sleep -Milliseconds 3000
$p.StandardInput.WriteLine("ls")
Run Code Online (Sandbox Code Playgroud) 有没有办法在调用时将字符串"推"到程序的stdin流?
这样我们才能有效果
echo "something" | ./my_program
Run Code Online (Sandbox Code Playgroud)
但是,不是在读取EOF之后"something",my_program将从原始标准输入(例如,键盘)读取其进一步输入.
示例:假设我们要启动一个bash shell,但我们要在其中做的第一件事就是调用date.echo date | bash不会做这个工作,因为shell会在运行后终止date.
我想创建一个交互式python散景图。我有两个通过列名称链接的数据框。当我在plot1中选择一个条形时,我想在plot 2中显示属于该列的数据框2(df2)的数据。例如,df1可以包含df2所有列的平均值。如果单击显示的均值,则可以在第二张图中查找构成均值基础的原始数据。不幸的是,我无法使其正常运行,也找不到可比较的示例。以下是到目前为止的内容。我认为错误在其中mycolumn="@colnames",而taptool没有返回我期望的结果。
下面的源代码根据@bigreddot的评论进行了更新
import pandas as pd
import numpy as np
from bokeh.models import ColumnDataSource, TapTool
from bokeh.plotting import figure
from bokeh.layouts import row
#from bokeh.plotting import show
from bokeh.io import curdoc
# data for plot 2
df2 = pd.DataFrame({"A" : np.linspace(10, 20, 10),
"B" : np.linspace(20, 30, 10),
"C" : np.linspace(30, 40, 10),
"D" : np.linspace(40, 50, 10),
"E" : np.linspace(50, 60, 10),})
source2 = ColumnDataSource(
data=dict(
x=list(df2.index.values),
y=list(df2.iloc[:,0].values)
)
)
# data for plot 1
df1 …Run Code Online (Sandbox Code Playgroud)