我有一个应用程序,它在python中读取测试脚本,并通过网络发送它们,以便在远程python实例上执行.由于控制程序不需要运行这些脚本,我不希望在控制器的python环境中安装测试脚本使用的所有模块.但是,控制器确实需要测试脚本中的信息来告诉它如何运行测试.目前我所做的阅读和导入测试脚本数据是类似的
with open( 'test.py', 'r' ) as f:
source = f.read()
m = types.ModuleType( "imported-temp", "Test module" )
co = compile( source, 'test.py', 'exec' )
exec co in m.__dict__
Run Code Online (Sandbox Code Playgroud)
这会产生一个包含测试的新模块.不幸的是,如果测试试图导入控制器没有的东西,exec将引发ImportErrors.更糟糕的是,该模块将不会完全导入.
如果我可以保证控制器不会使用丢失的模块,那么我可以忽略这些异常吗?或者通过其他方式找出测试中定义的名称和类?
示例测试:
from controller import testUnit
import somethingThatTheControllerDoesNotHave
_testAttr = ['fast','foo','function']
class PartOne( testUnit ):
def run( self ):
pass
Run Code Online (Sandbox Code Playgroud)
控制器需要知道的是_testAttr中的数据以及从testUnit继承的所有类定义的名称.
我不知道为什么,但我的VS 2015社区的ENC选项丢失了:
我已经在VS安装上进行了完全还原,问题不会消失.有人有这种问题吗?
我正在寻找一种方法来以编程方式获取.NET和Java中某个类类型的实例数.
比方说,我有Foo课.我希望能够在同一个过程中获得Foo所有实例的当前计数.
但是我无法修改Foo,所以带有计数的静态int已经出来了.此外,我不能只将我所做的所有实例添加到某些静态列表中并计算它.我希望能够说:
System.GC.numberOf< Foo >()
Run Code Online (Sandbox Code Playgroud)
或者其他的东西.
我正在查看垃圾收集器,但我找不到任何相关的方法.
我有一个使用多个线程的python应用程序,我很好奇在没有刻录CPU或锁定GIL的情况下在python中等待某些东西的最佳方法.
我的应用程序使用twisted和我生成一个线程来运行一个长操作,所以我不踩反应堆线程.这个长操作也会产生一些使用twisted的deferToThread执行其他操作的线程,并且原始线程想要等待deferreds的结果.
我一直在做的就是这个
while self._waiting:
time.sleep( 0.01 )
Run Code Online (Sandbox Code Playgroud)
这似乎破坏了扭曲的PB对象接收消息所以我认为睡眠锁定了GIL.下面的海报进一步调查显示它没有.
有更好的方法可以在不阻塞下面发布的反应器线程或python的情况下等待线程.
我最近重新编写了一个自己的库来尝试将接口与实现分离.我在最后一个问题上遇到了一个用于返回另一个类的实例的类.
在接口定义中,我做了类似的事情
struct IFoo
{
virtual const IBar& getBar() = 0;
}
Run Code Online (Sandbox Code Playgroud)
然后在具体的Foo getBar看起来像
const IBar& Foo::getBar()
{
Bar ret = Bar();
return ret;
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦getBar完成就会删除ret,当复制构造函数试图像这样使用Bar时会导致严重崩溃
const Bar myBar = myFoo.getBar();
Run Code Online (Sandbox Code Playgroud)
我一直在阅读各种各样的东西,我知道通过引用返回是不受欢迎的,但我没有看到任何其他方式(我不想返回Bar*因为我不想手动删除返回值).
抽象类返回从另一个抽象类派生的具体类的实例的正确方法(如果存在任何方式)是什么?
注意我确实看到了这个解决方案:从函数返回一个抽象类, 但我不想让返回值静态和松散线程安全.