小编jmd*_*_dk的帖子

Bash:杀死子流程中的所有流程

在bash中,我可以pid通过$!变量获取最后一个子进程的进程ID()。然后,我可以在此子进程完成之前将其杀死:

(sleep 5) & pid=$!
kill -9 $pid
Run Code Online (Sandbox Code Playgroud)

这工作如广告。如果现在我在之后用更多命令扩展子流程,即使其他命令从未执行过sleep,该sleep命令也会在子流程被杀死后继续执行。

例如,考虑以下内容,它启动一个子流程并使用监视其暗杀ps

# Start subprocess and get its pid
(sleep 5; echo done) & pid=$!

# grep for subprocess
echo "grep before kill:"
ps aux | grep "$pid\|sleep 5"

# Kill the subprocess
echo
echo "Killing process $pid"
kill -9 $pid

# grep for subprocess
echo
echo "grep after kill:"
ps aux | grep "$pid\|sleep 5"

# Wait for sleep to finish …
Run Code Online (Sandbox Code Playgroud)

unix linux bash shell kill

6
推荐指数
1
解决办法
762
查看次数

Eclipse Milo、OPC-UA:从哪里开始?

我对 OPC-UA 世界完全陌生。

我需要建立一个关于如何让我们的 ERP 与 PLC 通信的概念证明。我正在评估充当 OPC-UA 服务器的软件(它正在运行)。我发现了 Milo 并让代码在 Eclipse 中工作。查看示例,我将一个玩具程序连接到 OPC-UA 服务器并执行...

基本的管道工作,但我不知道从哪里开始使用 OPC-UA 和 Milo。我一直无法找到介绍材料来帮助我理解这一切。

是否有关于 OPC-UA 架构以及 Milo 如何实现的文档?有没有比查看示例来弄清楚应该如何做更好的方法呢?

opc-ua milo

6
推荐指数
1
解决办法
4160
查看次数

Python中的grep库输出

从命令行调用程序时,我可以管道输出grep以选择我想要查看的行,例如

printf "hello\ngood day\nfarewell\n" | grep day
Run Code Online (Sandbox Code Playgroud)

我正在寻找相同类型的行选择,但是对于从Python调用的C库.请考虑以下示例:

import os

# Function which emulate a C library call
def call_library():
    os.system('printf "hello\ngood day\nfarewell\n"')

# Pure Python stuff
print('hello from Python')
# C library stuff
call_library()
Run Code Online (Sandbox Code Playgroud)

运行这个Python代码时,我希望C部分的输出grep为字符串的ed 'day',从而产生代码的输出

你好,从Python
好日子

到目前为止,我已经stdout使用此处此处描述的方法摆弄了重定向.我能够使C输出完全消失,或将其保存到a str并稍后打印出来(这是两个链接主要关注的内容).然而,我无法根据其内容选择打印哪些行.重要的是,我希望在调用C库时实时输出,所以我不能只是重定向stdout到某个缓冲区并在事后对此缓冲区进行一些处理.

该解决方案只需要在Linux上使用Python 3.x. 如果除了行选择之外,该解决方案还可以进行行编辑,甚至可以更大.

我认为以下应该是可能的,但我不知道如何设置它

  • 重定向stdout到内存中的"文件".

  • 生成一个不断从该文件读取的新线程,根据行内容进行选择,并将所需行写入屏幕,即原始目标stdout.

  • 调用C库

  • 将两个线程重新连接在一起并重定向stdout回其原始目标(屏幕).

我对文件描述符等没有足够的把握能够做到这一点,甚至不知道这是否是最好的方法.

编辑

请注意,解决方案不能简单地重新实现代码call_library.代码必须调用 …

c python linux grep python-3.x

6
推荐指数
1
解决办法
619
查看次数

使用h5py以写入模式打开已打开的hdf5文件

我同时运行相同的Python程序作为不同的进程,所有这些都希望hdf5使用h5pyPython包写入同一文件。但是,只有一个进程可以hdf5以写入模式打开给定的文件,否则您将得到错误

OSError:无法打开文件(无法锁定文件,errno = 11,错误消息=“资源暂时不可用”)

在处理上述异常期间,发生了另一个异常:

OSError:无法创建文件(无法打开文件:name ='test.hdf5',errno = 17,错误消息='File exist',标志= 15,o_flags = c2)

我想通过检查文件是否已在写入模式下打开来解决此问题,如果是,请稍等一下,然后再次检查,直到不再在写入模式下打开文件为止。我没有发现h5py或的任何这种检查功能hdf5。到目前为止,我的解决方案基于以下内容:

from time import sleep
import h5py

# Function handling the intelligent hdf5 file opening
def open_hdf5(filename, *args, **kwargs):
    while True:
        try:
            hdf5_file = h5py.File(filename, *args, **kwargs)
            break  # Success!
        except OSError:
            sleep(5)  # Wait a bit
    return hdf5_file

# How to use the function
with open_hdf5(filename, mode='a') as hdf5_file:
    # Do stuff
    ...
Run Code Online (Sandbox Code Playgroud)

我不确定我是否喜欢这个,因为它看起来并不温柔。有什么更好的方法吗?我错误地尝试打开文件内的文件,是否try可能以某种方式破坏在另一个进程中进行的写入进程的任何变化?

python hdf5 multiprocessing file-writing h5py

6
推荐指数
1
解决办法
3942
查看次数

确定对象是否为Foo类型而不导入类型Foo

假设我在文件中定义了一个类:

import stuff
import more stuff
import stuff that takes a long time to import
class Foo(object):
    def __init__(self, arg1, arg2 etc.):
        self.arg1 = arg1 
        self.arg2 = arg2
        # Lots of other stuff
    # Lots of methods
Run Code Online (Sandbox Code Playgroud)

在另一个文件中我有这个代码:

from big_file import Foo
def do_stuff(obj):
    if isinstance(obj, Foo):
        do_stuff
    else:
        do_other_stuff
Run Code Online (Sandbox Code Playgroud)

假设文件Foo需要很长时间才能导入,原因是我无法控制.如何重构此代码以不导入Foo但仍可靠地检查类型?我不认为鸭子打字适合我的特殊情况.

我应该检查obj基础的字符串表示吗?还是有另一种更规范的方式?

python typechecking python-2.6

6
推荐指数
1
解决办法
530
查看次数

遍历熊猫数据框列表

两个快速的熊猫问题供您选择。

  1. 我有一个要应用过滤器的数据框列表。

    countries = [us, uk, france]
    for df in countries:
        df = df[(df["Send Date"] > '2016-11-01') & (df["Send Date"] < '2016-11-30')] 
    
    Run Code Online (Sandbox Code Playgroud)

    当我运行它时,df之后不会更改。这是为什么?如果我遍历数据帧以创建一个新列,如下所示,则可以正常工作,并更改列表中的每个df。

     for df in countries:
          df["Continent"] = "Europe"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 作为后续问题,当我创建不同国家的数据框列表时,我注意到了一些奇怪的事情。我定义了列表,然后将转换应用于列表中的每个df。在转换了这些不同的dfs之后,我再次调用了该列表。我很惊讶地看到列表仍然指向未更改的数据帧,因此我不得不重新定义列表以更新结果。有人能解释为什么会这样吗?

python list pandas

5
推荐指数
1
解决办法
7925
查看次数

使用||的Bash控制流程 在功能上,使用-e

如果我set -e输入了Bash脚本,该脚本将在以后出现错误时退出。我对此功能如何工作感到困惑。请考虑以下内容,这些内容仅会one按标准输出:

set -e # Exit on error
fun(){
    echo one
    non_existing_command
    echo two
}
fun
Run Code Online (Sandbox Code Playgroud)

显然,这non_existing_command是一个错误,因此脚本在第二个脚本之前退出echo。通常,只有在第一个命令失败时,才可以使用or运算符||运行另一个命令。也就是说,我怀疑以下内容可以同时打印onethree,但不能打印出来two

set -e # Exit on error
fun(){
    echo one
    non_existing_command
    echo two
}
fun || echo three
Run Code Online (Sandbox Code Playgroud)

但是我得到的是onetwo。也就是说,||操作员阻止退出(如应有的那样),但它选择继续使用功能主体,而忽略右手命令。

有什么解释吗?

error-handling bash shell function

5
推荐指数
1
解决办法
114
查看次数

Cython:memoryviews的size属性

我在Cython中使用了很多3D内存视图,例如

cython.declare(a='double[:, :, ::1]')
a = np.empty((10, 20, 30), dtype='double')
Run Code Online (Sandbox Code Playgroud)

我经常想要遍历所有元素a.我可以使用三重循环来做到这一点

for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        for k in range(a.shape[2]):
            a[i, j, k] = ...
Run Code Online (Sandbox Code Playgroud)

如果我不关心指数i,j并且k,它是更有效地做一个扁平环形,像

cython.declare(a_ptr='double*')
a_ptr = cython.address(a[0, 0, 0])
for i in range(size):
    a_ptr[i] = ...
Run Code Online (Sandbox Code Playgroud)

在这里,我需要知道size数组中的elements()数量.这由shape属性中的元素的乘积给出,即size = a.shape[0]*a.shape[1]*a.shape[2],或更一般地size = np.prod(np.asarray(a).shape).我发现这些都很难写,而且(虽然很小)的计算开销困扰着我.这样做的好方法是使用sizememoryviews 的builtin 属性size = a.size.但是,由于我无法理解的原因,这导致未经优化的C代码,从Cython生成的注释html文件中可以看出.具体来说,生成的C代码size = a.shape[0]*a.shape[1]*a.shape[2]很简单

__pyx_v_size = (((__pyx_v_a.shape[0]) * (__pyx_v_a.shape[1])) …
Run Code Online (Sandbox Code Playgroud)

python attributes cython memoryview typed-memory-views

5
推荐指数
1
解决办法
410
查看次数

matplotlib 3: 3D 散点图 with tiny_layout

我有一些代码使用 matplotlibscatter和 结合生成 3D 散点图tight_layout,请参阅下面的简化代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import proj3d 

fig = plt.figure()
ax = fig.gca(projection='3d')

N = 100
x = np.random.random(N)
y = np.random.random(N)
z = np.random.random(N)

ax.scatter(x, y, z)
plt.tight_layout()  # <-- Without this, everything is fine
plt.savefig('scatter.png')
Run Code Online (Sandbox Code Playgroud)

在 matplotlib 2.2.3 中,这会生成如下图: 在此处输入图片说明

旧版本会生成类似的输出,至少可以追溯到 1.5.1。使用新版本 3.0.0 时,出现问题,plt.tight_layout()我得到以下输出:在此处输入图片说明

伴随着这是警告

.../matplotlib/tight_layout.py:177: UserWarning: 左右边距不能足够大以容纳所有轴装饰

有人可能会争辩说,tight_layout像这里那样不带参数使用并不会(在较旧的 matplotlib 上)始终导致预期的边距收紧,因此首先应该避免使用tight_layout3D 绘图。但是,通过手动调整tight_layout它的参数(曾经是)一种即使在 3D 绘图上也可以修剪边距的体面方法。

我的猜测是这是 matplotlib 中的一个错误,但也许他们做了一些我没有注意到的故意更改。任何有关修复的指针表示赞赏。

python matplotlib scatter-plot python-3.x

5
推荐指数
1
解决办法
4833
查看次数

Python:强制导入更喜欢 .py 而不是 .so

我有一种情况,即相同的 Python 模块存在于两个不同版本的同一目录中;mymodule.pymymodule.so(我通过 Cython 从第一个获得后者,但这与我的问题无关)。当我从 Python 开始时

import mymodule
Run Code Online (Sandbox Code Playgroud)

它总是选择mymodule.so. 有时我真的想导入mymodule.py。我可以暂时移动mymodule.so到另一个位置,但是如果我同时运行另一个需要导入mymodule.so.

现在的问题是,如何让import喜欢.py过的文件.so,而不是相反?

这是我对解决方案的想法:我想象使用importlib并可能编辑sys.meta_path. 具体来说,我看到sys.meta_path[2]Hold_frozen_importlib_external.PathFinder用于导入外部模块,即这用于mymodule.pymymodule.so。如果我可以将其替换PathFinder为对文件类型使用相反顺序的类似方法,我将有一个解决方案。

我正在使用 Python 3.7,如果这会影响解决方案。

编辑

请注意,简单地读入mymodule.pyexec'ing 它们的源代码行是行不通的,因为mymodule.py它本身可能会导入同样存在于 a.py.soversion 中的其他模块(我也想导入.py这些模块的版本)。

python import cython python-import python-3.x

5
推荐指数
1
解决办法
159
查看次数