语境:
我经常使用Java 启动 shebang来使我的 Java 源文件像脚本一样运行。我还经常直接从 IntelliJ IDEA 运行项目。我的许多 Java 文件都以#!/path/to/my/java/launcher.
我意识到这种做法在除了最基本的测试场景之外的所有场景中都是有问题的,但这就是我使用它的全部目的。
这很方便,因为当我不在 IDEA 中进行本地测试时,我经常在多个不同的服务器上运行测试。将 IDEA 指向不同的远程服务器以在其上运行代码很麻烦,而直接访问这些服务器(代码已经存在,因为它存储在网络共享上)并使用 运行文件./MyFile.java,或者指示其他人执行以下操作要容易得多相同的。
问题:
如果我在 IDEA 中有一个带有 Java shebang 的文件,它将无法编译。该#!行(以及文件的其余部分)被 IDE 检测为语法错误。
问题:
如何配置 IDEA 来处理包含技术上无效语法 shebang 的 Java 文件?
理想情况下,我能够告诉 IDEA“#!在语法检查/编译时忽略 .java 文件中第一个和开头的行”。但是,如果我可以配置一条“语法检查/编译时忽略所有 .java 文件的第一行”规则,我也会很高兴。
更根本地说:如何让 IDEA 支持(编译,认为有效)包含 -#!前缀第一行的 Java 文件?
我尝试过的:
javac以使用管道/匿名文件描述符并tail排除第一行;没有这样的运气。这是 StackOverflow 上的问题,而不是 SuperUser/ServerFault 上的问题,因为它与 sshd 执行的系统调用和操作系统交互有关,而不是我使用SSH时遇到的问题(尽管对此的帮助也值得赞赏:p)。
语境:
我通过 SSH 调用一系列复杂的脚本,例如ssh user@host -- /my/command. 远程命令执行大量复杂的分叉和执行,最终导致在远程主机上运行后台守护进程。有时(我正在慢慢地疯狂地试图找出可靠的复制条件),该ssh命令永远不会将控制权返回给客户端 shell。在这些情况下,我可以进入目标主机并看到sshd: user@notty没有子进程无限期挂起的进程。
解决这个问题不是这个问题的目的。这个问题是关于该sshd进程正在做什么的。
SSH实现是OpenSSH,版本版本是5.3p1-112.el6_7。
问题:
如果我找到其中一个卡住的sshds 和strace它,我可以看到它正在对两个句柄进行选择,例如select(12, [3 6], [], NULL, NULL或类似的。lsof告诉我这些句柄之一是连接回 SSH 客户端的 TCP 套接字。另一个是管道,其另一端仅在同一sshd进程中打开。如果我使用此超级用户问题的答案按 ID 搜索该管道,则包含对该管道的引用的唯一进程是同一进程。lsof证实了这一点:管道的读写端在同一进程中打开,例如(对于管道 788422703 和sshdPID 22744):
sshd 22744 user 6r FIFO 0,8 0t0 788422703 pipe
sshd 22744 user 7w FIFO …Run Code Online (Sandbox Code Playgroud) 语境:
在学术上,我对以防止PID 环绕的方式跟踪/识别 UNIX 进程感兴趣。要开始通过 PID 跟踪进程,我需要能够在系统上最终识别它。
因此,我需要一个函数 ,get_identity它接受 PID,并且只有在确定了该 PID 的系统范围唯一标识后才返回。该函数应该适用于所有或大多数符合 POSIX 标准的系统。
据我所知,进程表中唯一不可变的值是 PID 和启动时间。然而,以下场景会带来问题:
get_identity(pid)get_identity读取 的开始时间(以秒为单位)pid(如果存在),并返回希望唯一的元组[pid, starttime](这是优秀的psutilPython 库认为“足够唯一”的内容,因此它应该非常强大)。pid回收。[pid, starttime]元组现在引用的进程与调用时出现的进程不同get_identity。虽然发生 PID 环绕并在识别后一秒内重新使用所选 PID 的可能性极小,但这并非不可能。。。正确的?
问题:
我尝试过的:
sleep在检查目标进程后我可以简单地花一秒钟。如果 后的启动时间(以秒为单位)相同sleep,则它要么是我开始观看的同一进程,要么 PID 已转换为不同的进程,但系统无法区分。如果开始时间发生了变化,我可以返回错误,或者重新开始。然而,这需要我的识别功能最多等待1秒才能返回,这并不理想。times()返回以时钟周期为单位的值,我可以将其转换为秒。假设进程的启动时间(以秒为单位)基于times使用的相同时钟,并且假设所有 UNIX 使用相同的舍入逻辑从 进行转换,理论上我可以使用此信息来减少上述解决方法中clock …假设我正在kill用 Go 实现该程序。我可以接受来自命令行的数字信号和 PID,并将它们发送出去,syscall.Kill没有任何问题。
但是,我不知道如何实现信号调度的“字符串”形式,例如kill -INT 12345。
真正的用例是一个较大程序的一部分,提示用户发送终止信号;不是 的替代品kill。
问题:
如何在运行时将有效信号名称转换为任何支持的平台上的信号号(或者至少无需编写要在编译时运行的每个平台代码)?
我尝试过的:
kill -l这不能以跨平台的方式工作(例如, Mac OSX 与现代 Linux 与旧版 Linux 上返回不同的信号列表)。使该解决方案普遍有效的唯一方法是为每个操作系统制作地图,这需要我了解每个操作系统的行为,并在它们添加新信号支持时保持最新状态。kill工具并从中捕获信号列表。这是不优雅且有点悖论的,并且还需要 a) 能够找到kill,b) 具有执行子进程的能力/权限,以及 c) 能够预测/解析kill二进制文件的输出。Signal的String方法。这仅返回包含信号编号的字符串,例如os.Signal(4).String() == "signal 4",这没有用。runtime.signame,它正是我想要的。go://linkname黑客会起作用,但我认为这种事情不受欢迎是有原因的。我没有尝试过的想法/事情:
syscall以某种方式反思和解析该成员SIG。有人告诉我这是不可能的,因为名字是被编译掉的;有没有可能,对于像信号名称这样基本的东西,在某些地方它们没有被编译掉?我正在尝试在Excel VBA(2007)中调用函数,并且在调用时收到语法错误.我有一个名为ImportSets的数据结构数组,它包含工作表和字符串,我试图将该数组中的项目成员传递给一个名为Import的函数.
调用代码如下所示:
For n = 1 To 7
Debug.Print ("Destsheet: " & ImportSets(n).DestSheet.name)
Debug.Print ("Sourcesheet: " & ImportSets(n).SourceSheet.name)
Debug.Print ("Sourcecolumn: " & ImportSets(n).SourceColumn)
Import(CostAnalysisWorksheet.Sheets("Reimbursements"), ImportSets(n).DestSheet, ImportSets(n).SourceSheet, ImportSets(n).SourceColumn)
Next n
Run Code Online (Sandbox Code Playgroud)
所有Debug.Print语句都返回有意义且正确的字符串,并检查"Reimbursements"是否存在返回true.方法调用在一行上.这是ImportSet对象代码:
Public Type ImportSet
DestSheet As Worksheet
SourceSheet As Worksheet
SourceColumn As String
...other code...
End Type
Run Code Online (Sandbox Code Playgroud)
函数体看起来像这样:
Function Import(ByRef ReimbursementSheet As Worksheet, ByRef DestSheet As Worksheet, ByRef ImportSheet As Worksheet, ByRef ImportSheetPriceColumn As String) As String
....code here .....
End Function
Run Code Online (Sandbox Code Playgroud)
我在函数调用中遇到了红色突出显示的语法错误(在第一个代码段中).我可能错过了一些愚蠢的东西.它是什么?
假设我有一个重复的函数或方法,比如在执行每个操作之前检查一个值,如下所示:
def myfunc():
if mybool:
do_operation_1()
else:
return
if mybool:
do_operation_2()
else:
return
...
Run Code Online (Sandbox Code Playgroud)
这些检查会重复,最终会浪费大量时间和键盘弹簧,特别是在经常需要时.
如果您可以控制操作函数,例如,do_operation_N您可以使用检查布尔值的函数来修饰函数.
但是,如果您无法控制各个do_operation_N操作,该怎么办?如果,对于函数或方法中的每一行,我想要执行相同的检查,是否有某种方法可以"插入"它而无需在每个操作行上明确写入它?例如,是否有一些装饰魔术我可以做以下事情?
def magic_decorator(to_decorate):
def check(*args, **kwargs):
for call in to_decorate: #magic
if mybool:
to_decorate.do_call(call) #magic
else:
return #or break, raise an exception, etc
return check
@magic_decorator
def myfunc():
do_operation_1()
do_operation_2()
...
Run Code Online (Sandbox Code Playgroud)
如果有办法实现这一点,我不在乎它是否使用装饰器; 我只是想用某种方式说"对于函数/方法X中的每一行,先做Y".
do_call上面方法的"神奇"示例是我所追求的简写,但它会遇到单个行的无序执行的严重问题(例如,如果函数的第一行是变量赋值,并且第二个是使用该变量,不按顺序执行它们会导致问题).
要明确:外部控制函数执行的逐行顺序的能力不是我想要实现的:理想情况下,我只是实现一些在自然执行顺序中执行操作的东西每次myfunc都做点什么.如果"做某事"最终被限制为"调用函数或方法"(不包括赋值,if检查等),那很好.
python metaprogramming decorator self-modifying python-decorators
语境:
我维护遗留的 Django 代码。在许多情况下,我的代码接收多个模型对象,每个模型对象都有一个ForeignKey或代表相同数据实体的手动缓存属性。因此所涉及的数据实体不会改变。但是,并非我收到的所有对象都曾经访问过这些foreignkey字段或缓存的属性,因此数据可能不会出现在这些对象上,尽管它会在第一次访问时延迟加载。
我不容易访问/控制声明模型的代码。
我想找到我拥有的任何一个具有已准备好的缓存的对象,这样我就可以避免访问数据库来检索我想要的数据(如果没有,我会在必要时这样做)。这是因为该数据的获取过于频繁,导致性能问题。
Django 1.6,Python 2.7。
问题
我可以询问我们手动缓存的字段,并且internal_is_cached(instance, 'fieldname')无需运行查询。但是,我无法对ForeignKey字段执行此操作。
假设我在 Django 中有一个模型类,Foo如下所示:
class Foo(models.Model):
bar = models.ForeignKey('BarModel')
Run Code Online (Sandbox Code Playgroud)
问题
Foo如果我从某处获取模型的实例,但我不知道是否bar曾经调用过它,或者是否已急切地获取它,我如何确定读取instance.bar是否会查询数据库?
换句话说,我想从外部确定任意模型是否具有针对给定的内部缓存ForeignKey,而关于该模型的状态或来源的其他知识为零。
我尝试过的
我尝试使用 Django 缓存进行模型缓存来解决该问题。相关数据的获取过于频繁,以至于对我们的缓存系统造成了不可持续的负载。
我从这个问题尝试了各种解决方案。它们适用于修改后的模型,但似乎不适用于尚未突变的模型——我对模型的“延迟加载”状态感兴趣,而不是“待修改”状态。其中许多解决方案也不适用,因为它们需要更改模型继承或行为,我希望尽可能避免这种情况(政治)。
这个问题看起来很有希望,但它需要控制模型的初始读者过程。我的代码接收到的模型对象可以来自任何地方。
_default_manager模型对象的内部方法,众所周知,这对于我们在生产中的一些(高度定制的)模型对象来说是不准确的字段引用。其中一些非常奇怪,如果可能的话,我更愿意坚持使用记录的(或者至少是稳定的并且不经常被绕过的)API。