我正在尝试为命令行程序(svnadmin verify)编写一个包装器脚本,它将为操作显示一个很好的进度指示器.这要求我能够在输出后立即查看包装程序的每一行输出.
我想我只是执行程序使用subprocess.Popen
,使用stdout=PIPE
,然后读取每一行,并相应地对其进行操作.但是,当我运行以下代码时,输出似乎在某处缓冲,导致它出现在两个块中,第1行到第332行,然后是333到439(输出的最后一行)
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
Run Code Online (Sandbox Code Playgroud)
稍微查看子进程的文档后,我发现bufsize
参数为Popen
,所以我尝试将bufsize设置为1(缓冲每行)和0(无缓冲区),但这两个值似乎都没有改变行的传递方式.
此时我开始掌握吸管,所以我编写了以下输出循环:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
Run Code Online (Sandbox Code Playgroud)
但得到了相同的结果.
是否有可能获得使用子进程执行的程序的"实时"程序输出?Python中是否有其他选项可以向前兼容(不是exec*
)?
我正在为一块软件实现Gradle构建系统,该软件具有在没有Internet连接的情况下开发的部件或者能够安装Maven/Ivy服务器(如Nexus).为了支持这些环境中的开发,我正在整理一个允许生成"离线工作区"的Gradle插件.
我最初通过触发项目中每个配置的解析(触发所有依赖项的下载),然后遍历每个配置的整个依赖关系树并将依赖关系的本地缓存副本复制到Offline Workspace来实现此功能.(为每个复制操作生成了一个复制任务.)然后使用flatDir存储库引用这些JAR.
此实现使用afterEvaluate块执行其作业.虽然这在Gradle 2.0中运行良好,但它会在Gradle 2.2.1中触发弃用警告,因为触发分辨率在某种程度上被视为在已经解析后修改配置(Attempting to change configuration ':core:runtime' after it has been included in dependency resolution. This behaviour has been deprecated and is scheduled to be removed in Gradle 3.0
).总之,这种方法感觉相当hacky,因为它还要求我修改build.gradle文件以显式列出所有传递依赖项,因为没有可用于正确指定依赖项的POM文件.
更优雅的方法似乎是构建所有依赖项的本地Maven存储库(包括POM文件,源JAR,javadoc JAR等),然后只使用mavenLocal()存储库类型.不幸的是,我不确定如何正确地执行此操作,我不需要触发工件解析来执行此操作.
有没有更好的方法可以实现完整的工件下载到一个易于打包的方式,而不仅仅是压缩我的整个$ USER_HOME/.gradle目录?
我正在尝试在我正在使用的Python程序中使用一点继承.我有一个基类User,它实现了用户的所有功能.我添加了一个未经批准的用户的概念,就像用户一样,增加了一个方法.
User类有一些返回User对象的方法.当我进行子类化时,这将不起作用,因为我最终会让UnapprovedUser返回一个User,阻止我调用此方法等等.
class User(object):
base_dn = 'ou=Users,dc=example,dc=org'
@classmethod
def get(cls, uid):
ldap_data = LdapUtil.get(uid + ',' + self.base_dn)
return User._from_ldap(ldap_data)
class UnapprovedUser(User):
base_dn = 'ou=UnapprovedUsers,dc=example,dc=org'
def approve(self):
new_dn = '' # the new DN
LdapUtil.move(self.dn, new_dn)
Run Code Online (Sandbox Code Playgroud)
两个类的get()
和_from_ldap()
方法相同,但get()
UnapprovedUser中的方法需要返回UnapprovedUser对象,而不是User.
如何将我获得的User的一个实例User.get()
转换为UnapprovedUser?
我想做的事情如下:
class UnapprovedUser(User):
# continued from before
@classmethod
def get(cls, uid):
user = super(UnapprovedUser, cls).get(uid)
return (UnapprovedUser) user # invalid syntax
Run Code Online (Sandbox Code Playgroud)
这样我就可以从父进程中包装该方法,并简单地将返回的值强制转换为正确的类.然后,这样做可能导致父母使用他们的价值self.base_dn
,这将打破一切.
我来自Java世界,您可以在其中隐藏变量和函数,然后使用反射对它们运行单元测试.我使用嵌套函数来隐藏类的实现细节,以便只显示公共API.我正在尝试针对这些嵌套函数编写单元测试,以确保在开发时不会破坏它们.我试过调用一个嵌套函数,如:
def outer():
def inner():
pass
outer.inner()
Run Code Online (Sandbox Code Playgroud)
这会导致错误消息:
AttributeError:'function'对象没有属性'inner'
有没有办法让我对这些嵌套函数编写单元测试?如果没有,有没有办法通过为__添加前缀来触发名称,为类变量触发函数名称?
我有一个正则表达式和替换模式,已经在我的输入数据上使用Notepad ++进行了测试并正常工作.然而,当我将它们放入sed表达式时,没有任何东西可以匹配.
这是sed命令:
# SEARCH = ([a-zA-Z0-9.]+) [0-9] (.*)
# REPLACE = \2 (\1)
sed -e 's/\([a-zA-Z0-9.]+\) [0-9] \(.*\)/\2 \(\1\)/g'
Run Code Online (Sandbox Code Playgroud)
以下是数据的抽样:
jdoe 1 Doe, John
jad 1 Doe, Jane
smith 2 Smith, Jon
Run Code Online (Sandbox Code Playgroud)
和期望的输出:
Doe, John (jdoe)
Doe, Jane (jad)
Smith, Jon (smith)
Run Code Online (Sandbox Code Playgroud)
我已经尝试删除并添加转义到sed表达式中的不同字符,但要么没有得到任何匹配或类似的东西:
sed: -e expression #1, char 42: invalid reference \2 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)
如何才能正确转义?
我有一个JLabel的子类,它构成了我GUI的一个组件.我已经实现了将组件从一个容器拖放到另一个容器的能力,但没有任何视觉效果.我想让这个JLabel在项目从一个容器拖动到另一个容器期间跟随光标.我想我可以创建一个玻璃窗格并在那里绘制它.但是,即使我将组件添加到玻璃窗格,将组件设置为可见,并将玻璃窗格设置为可见,并将玻璃窗格设置为不透明,我仍然看不到该组件.我知道该组件有效,因为我可以将其添加到内容窗格并显示它.
如何将组件添加到玻璃窗格?
最后想出了如何让简单的例子工作.谢谢,@ akf.我能够使这个解决方案适应我原来的问题,允许我删除约60行Java2D代码,这些代码手动呈现JLabel的表示.
package test;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
public class MainFrame extends JFrame {
/**
* @param args
*/
public static void main(String[] args) {
MainFrame mf = new MainFrame();
mf.setSize(400, 400);
mf.setLocationRelativeTo(null);
mf.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
mf.setGlassPane(new JPanel());
JLabel l = new JLabel();
l.setText("Hello");
l.setBorder(new LineBorder(Color.BLACK, 1));
l.setBounds(10, 10, 50, 20);
l.setBackground(Color.RED);
l.setOpaque(true);
l.setPreferredSize(l.getSize());
//mf.add(l);
((JPanel)mf.getGlassPane()).add(l);
mf.getGlassPane().setVisible(true);
mf.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud) 我是Erlang的新手,正在尝试编写一个有界缓冲问题程序.它几乎可以工作,除了确保生产者不会过早地覆盖未使用的数据.为了解决这个问题,我决定尝试在我的buffer()函数上设置保护程序,这样我就可以在缓冲区已满时使用一个没有接收的版本,在缓冲区为空时使用一个没有发送的版本,并且正常其余时间的版本.
我的问题是,无接收器版本的保护要求我知道代表缓冲区的数组的大小,这需要调用array:size/1
.显然,Erlang不允许在警卫中进行函数调用,这会阻止它工作.有没有办法解决这个问题而不改变我的缓冲区actor的函数声明?
%% buffer: array num num
%% A process that holds the shared buffer for the producers and consumers
buffer(Buf, NextWrite, NextRead) when NextWrite == NextRead ->
io:format(" * ~w, ~w, ~w~n", [array:to_list(Buf), NextRead, NextWrite]),
receive
{enqueue, Reply_Pid, Num} ->
io:format("~w: > ~w~n", [Reply_Pid, Num]),
buffer(array:set(NextWrite rem array:size(Buf), Num, Buf), NextWrite + 1, NextRead);
finish ->
io:format("finished printing~n")
end;
buffer(Buf, NextWrite, NextRead) when (NextWrite - NextRead) == array:size(Buf) ->
io:format(" * ~w, ~w, ~w~n", [array:to_list(Buf), NextRead, NextWrite]), …
Run Code Online (Sandbox Code Playgroud) 我想尝试一行文字
13) Check for orphaned Path entries
Run Code Online (Sandbox Code Playgroud)
并将其更改为(我希望bash颜色代码为输出着色,而不是在屏幕上显示)
\033[32m*\033[0m Check for orphaned Path entries
Run Code Online (Sandbox Code Playgroud)
使用bash颜色代码对星号进行着色,使其更加突出.我有一个sed命令执行大部分操作,除了它没有正确处理颜色代码,因为它将它们视为对替换文本的引用.
到目前为止我所拥有的:
sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/"
Run Code Online (Sandbox Code Playgroud)
当我在开头给出的字符串上运行时产生以下输出:
13) Check for orphaned Path entries33[32m* 13) Check for orphaned Path entries33[0m Check for orphaned Path entries
Run Code Online (Sandbox Code Playgroud)
它取\ 0的\ 0并用原始字符串替换它.将替换字符串中的反斜杠加倍并没有什么区别; 我仍然得到相同的输出文本.
如何将bash颜色转义插入到sed替换表达式中?
我正准备部署我的第一个Django应用程序,并且遇到了一些障碍.我的基本模板依赖于我传入会话对象,以便它可以读出当前登录的用户名.当我控制调用模板的代码时,这不是问题.
但是,作为准备部署此应用程序的一部分,我需要创建一个404.html页面.我扩展了我的基本模板,就像我已经完成了其他页面一样,但我没有看到传递会话对象的方法,以便我可以利用它.有没有办法让Django调用自定义方法来渲染你的404而不只是为你呈现你的404.html?
我有一个嵌套在JScrollPane内的JList.当我向JList添加项目时,我希望JScrollPane自动滚动到JList的底部,以便最后一项可见.为此,我有以下代码:
getWordListScroller().getVerticalScrollBar().getModel().setValue(getWordListScroller().getVerticalScrollBar().getModel().getMaximum());
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用此代码时,JScrollPane仅滚动到倒数第二个项目,将最后一个项目排除在视图之外.这绝不是理想的.我已经尝试将值添加到getMaximum(),但问题仍然存在.
如何让JScrollPane滚动到最底层?