我最近的任务是维护一堆使用from module import *相当多的代码.
这个代码库变得足够大,以至于导入冲突/命名歧义/"这个功能来自何处,有八个导入的模块有一个同名的名字?!"ism变得越来越普遍.
继续前进,我一直在使用显式成员(即import module ... module.object.function()为了使维护工作更具可读性.
但我想知道:是否有一个IDE或实用程序可以强大地解析Python代码并重构*导入语句到模块导入语句中,然后将完整的模块路径预先添加到该模块成员的所有引用上?
我们没有大量使用元编程/反射/ inspect/ monkeypatching,所以如果上面的IDE/util在这些事情上表现不佳,那就没关系.
有没有办法使用Node.js检查系统上的任意PID是运行还是活动?假设Node.js脚本具有相应的读取权限/proc或Windows等效权限.
这可以同步完成:
if (isAlive(pid)) { //do stuff }
Run Code Online (Sandbox Code Playgroud)
或异步:
getProcessStatus(pid, function(status) {
if (status === "alive") { //do stuff }
}
Run Code Online (Sandbox Code Playgroud)
请注意,我希望找到一个适用于任意系统PID的解决方案,而不仅仅是运行Node.js进程的PID.
我正在用Python编写一个线程程序.该程序经常被用户(CRTL + C)交互以及发送各种信号的其他程序中断,所有这些都应以各种方式停止线程操作.线程按顺序执行一系列工作单元(我称之为"原子").
每个原子都可以快速安全地停止,因此使线程本身停止是相当微不足道的,但我的问题是:实现可停止线程的"正确"或规范方法是什么,给予可停止的伪原子工作完成?
我应该stop_at_next_check在每个原子之前轮询一个标志(例如下面的例子)?我应该用标记检查的东西来装饰每个原子(基本上与示例相同,但隐藏在装饰器中)?或者我应该使用其他一些我没有想到的技术?
示例(简单停止标志检查):
class stoppable(Thread):
stop_at_next_check = False
current_atom = None
def __init__(self):
Thread.__init__(self)
def do_atom(self, atom):
if self.stop_at_next_check:
return False
self.current_atom = atom
self.current_atom.do_work()
return True
def run(self):
#get "work to be done" objects atom1, atom2, etc. from somewhere
if not do_atom(atom1):
return
if not do_atom(atom2):
return
#...etc
def die(self):
self.stop_at_next_check = True
self.current_atom.stop()
Run Code Online (Sandbox Code Playgroud) 在 MacOS 上,我有一组python我无法控制的二进制文件(即我无法使用 来构建它们LDFLAGS='-undefined error')。
在某些 MacOS 主机/体系结构(即某些 ARM Mac,但不是全部;某些 x86 Mac,但不是全部)上,在 Python 中执行某些操作会失败,并显示dyld[some_pid]: missing symbol called.
如何找出导致问题的库文件以及丢失的符号(按名称)?
使用以下环境显示dyld的诊断输出:
DYLD_PRINT_LIBRARIES=1
DYLD_PRINT_APIS=1
DYLD_PRINT_WARNINGS=1
Run Code Online (Sandbox Code Playgroud)
这会导致失败的操作在崩溃之前发出看似成功的操作。 dyld但诊断输出还不够;例如,它通常看起来像这样:
dyld[91757]: dyld_image_path_containing_address(0x10a7ab000) => '/path/to/python/lib/lib.macosx-10.15-x86_64-3.7/_csv.cpython-37m-darwin.so'
dyld[91757]: _dyld_is_memory_immutable(0x10a7ab000, 28) => 0
dyld[91757]: dlopen(_csv.cpython-37m-darwin.so) => 0x210fbb0c0
dyld[91757]: dlsym(0x210fbb0c0, "PyInit__csv")
dyld[91757]: dlsym("PyInit__csv") => 0x10a7abbc0
dyld[91757]: missing symbol called
Run Code Online (Sandbox Code Playgroud)
在该示例中,nm报告_csv.cpython-37m-darwin.so可以解析名为 的符号PyInit__csv。所以看起来(我认为)错误missing symbol called在不同的符号上失败了,但我不知道如何确定是哪一个。
语境:
我有一个bash脚本,其中包含一个子shell和一个EXIT伪信号的陷阱,并且它没有正确捕获中断期间的中断rsync.这是一个例子:
#!/bin/bash
logfile=/path/to/file;
directory1=/path/to/dir
directory2=/path/to/dir
cleanup () {
echo "Cleaning up!"
#do stuff
trap - EXIT
}
trap '{
(cleanup;) | 2>&1 tee -a $logfile
}' EXIT
(
#main script logic, including the following lines:
(exec sleep 10;);
(exec rsync --progress -av --delete $directory1 /var/tmp/$directory2;);
) | 2>&1 tee -a $logfile
trap - EXIT #just in case cleanup isn't called for some reason
Run Code Online (Sandbox Code Playgroud)
脚本的想法是这样的:大多数重要的逻辑运行在子shell中,通过管道传输tee到日志文件,因此我不必tee将主逻辑的每一行都记录下来.每当子shell结束,或脚本因任何原因停止(EXIT伪信号应捕获所有这些情况),陷阱将拦截它并运行该cleanup()函数,然后删除陷阱.该rsync和sleep命令(睡眠只是一个例子)通过运行exec,以防止僵尸进程的创建,如果我杀了父脚本,而他们正在运行,并且每个潜在的,长期运行的命令被包裹在自己的子shell,这样,当exec …
我有一堆通用的清理代码需要在某个bash脚本退出时完成,无论它是正常退出还是被中断.我想我会使用trap "..." EXIT伪信号来实现这一点.
除了通用的清理工作之外,还有一个特定的清理工作,只有在脚本正常完成时才能完成.我想我可以通过让'trap'块测试一个变量来触发这个,就像这样:
#!/bin/bash
done=false;
trap "{
#generic cleanup code goes here.
if $done
then
#cleanup to be done only on completion goes here.
echo Test;
fi
}" EXIT
#main script goes here
done=true;
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.运行以下代码永远不会回显"测试".之后添加显式exit调用done=true;不会更改任何内容.我错过了什么?
干杯!
语境:
我有一些使用的代码pexpect,其工作是给出一个命令的"实时"输出.即,当命令生成一些输出时或不久之后打印出一些内容,而不是等到命令完成然后与其输出交互.
我正在做的就是启动和停止服务.我spawn通过该过程执行此操作,然后在打印时输出每一行,如下所示:
def watch(process):
output = ""
while True:
try:
line = process.read_nonblocking(timeout = -1)
print(line, end ="")
output += line
except pexpect.EOF:
break
del process
return output
while True:
print("IN 1")
process = pexpect.spawn("service",["zend-server", "stop"], timeout = None)
watch(process)
print("OUT 1")
print("IN 2")
process = pexpect.spawn("service",["zend-server", "start"], timeout = None)
watch(process)
print("OUT 2")
Run Code Online (Sandbox Code Playgroud)
这段代码应该只循环服务:启动它并反复停止它,打印开始/停止的输出.它打印输出正常.但是,它最终会在"OUT 2"之前挂起.我可以查看输出,并看到service调用停止执行.但是,该watch功能从不会提高EOF并退出.
每项服务都不会发生这种情况.有些服务无限循环.zend-server但是,与其他一些不相关的命令一起,以相同的方式间歇性地失败.
通过"最终挂起",我的意思是它启动/停止服务一些(每次运行变量)次,并挂起.它通常在4-6之后长大,虽然从来没有在第一次通话 - 总是至少在第二次(因此del声明;我认为我会安全地玩).
Python 2.6.6,CentOS(64)6.3,Pexpect 2.3-6,FWIW
题:
为什么pexpect挂在某些命令上?我该如何解决这个问题?使用超时不是一个可行的解决方案,因为其中一些命令实际上可以运行任意长时间. …
语境:
我有一个在Linux上运行的多分叉Perl(5.16)进程.父fork加载了大量的Perl代码(via use/require)并分配了大量的数据结构(几GB).然后它创建了许多子叉,所有子叉并行工作.这样做是为了减少进程运行时的内存占用,因为写入时写入的性质fork()意味着子进程可以使用父进程拥有的数据而不保留每个进程的大内存映像.
问题:
所有这一切都正常,直到我尝试关闭进程组.当我中断父节点(信号传播给所有子节点)时,运行代码的服务器上的内存立即填满,它开始交换,服务器上的其他进程停止运行.当一个copy-on-write fork关闭时,Perl似乎试图重新分配父中声明的所有内存,以便它可以标记它free或什么.
题:
如何防止这种臃肿的关机发生?有什么办法我可以告诉孩子只能尝试遍历并回收那些分配的内存吗?
我试图在不触及文件系统的情况下运行ImageMagick:从内存/网络读取图像数据,并将其作为blob写回套接字.
但是,ImageMagick不断尝试编写临时文件,这些文件由于测试中止/失败而填满我的测试系统,或者在磁盘速度极慢的系统上引起问题:这是一个奇怪的约束,但我的许多转换主机都是嵌入式系统使用块设备,响应任何操作都非常慢,甚至是stat()s.
问题:
有没有办法配置ImageMagick在图像处理期间不接触磁盘?假设已经加载了ImageMagick将使用的所有必需模块,并且没有任何ImageMagick功能将处理输出到与文件系统通信的子进程用过的.
这样做有什么副作用?我可以处理不适合内存失败的处理,而不是回到磁盘上.
我正在使用C++或Perl ImageMagick API进行转换,而不是convert实用程序.但是,如果另一个绑定支持这一点,我很好地切换平台.
我试过的
MAGICK_TEMPORARY_PATH各种各样的地方,包括/dev/nullPOSIX./dev/null有时似乎工作,但我的目标系统不是POSIX,所以我不确定我是否可以指望它.而不是愚弄临时文件管理系统,我更喜欢我可以信任的东西,首先禁用对临时文件的需求.registry:temporary-path选项,结果相似./dev/null或者不可写的位置)通常会导致在我的程序启动的目录中创建临时文件.如果该目录是不可写的,我已经看到临时文件在系统/tmp目录中创建,即使代码被告知不使用它.这些似乎发生在特殊情况下(例如segfaulting/OOMing/kill -9'd情况),所以我认为通常可以在这些地方创建文件,但通常会清理它们.上下文
我正在尝试将PDF.JS导入TypeScript项目.我使用的是DefinitelyTyped 绑定的pdfjs-dist,通过安装npm install @types/pdfjs-dist和npm install pdfjs-dist.
问题
我似乎无法使用TypeScript来编译我的项目.我正在使用直接从DefinitelyTyped上的测试中复制的源代码.这是我正在尝试编译的简化(仅删除)代码(来自DefinitelyTyped的测试代码的精确副本也以相同的方式失败):
import { PDFJSStatic } from 'pdfjs-dist';
var PDFJS: PDFJSStatic;
PDFJS.getDocument('helloworld.pdf').then(console.log);
Run Code Online (Sandbox Code Playgroud)
TypeScript查找类型声明模块,并认为导入PDFJSStatic有效.它不认为PDFJS是以往任何时候都初始化,但是如果我关掉strict中tsconfig,代码编译,但它编译于:
"use strict";
exports.__esModule = true;
var PDFJS;
PDFJS.getDocument('helloworld.pdf').then(console.log);
Run Code Online (Sandbox Code Playgroud)
这显然不起作用.它没有将import声明编译成任何东西.
题
如何将PDF.JS导入TypeScript项目并通过声明文件将其编译为工作的Node.JS代码@types/pdfjs-dist?
我试过的
我尝试了不同的变化import,但无济于事.切换到require也似乎没有帮助.
我已经验证了pdjs-dist依赖关系以及@types/pdfjs-dist依赖关系是否直接来自NodeJS(非TypeScript程序),是否存在,更新和可用.
我module在tsconfig中尝试了各种值.它们有时会更改生成的代码,但它们都没有更改它以包含所需的导入.
我试着将/// <reference path="../node_modules/@types/pdfjs-dist/index.d.ts" />上面的import线.这并没有改变这种行为.
环境
tsc版本2.4.2,节点8.5和npm5.3.我的tsconfig.json …