在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) 我对 OPC-UA 世界完全陌生。
我需要建立一个关于如何让我们的 ERP 与 PLC 通信的概念证明。我正在评估充当 OPC-UA 服务器的软件(它正在运行)。我发现了 Milo 并让代码在 Eclipse 中工作。查看示例,我将一个玩具程序连接到 OPC-UA 服务器并执行...
基本的管道工作,但我不知道从哪里开始使用 OPC-UA 和 Milo。我一直无法找到介绍材料来帮助我理解这一切。
是否有关于 OPC-UA 架构以及 Milo 如何实现的文档?有没有比查看示例来弄清楚应该如何做更好的方法呢?
从命令行调用程序时,我可以管道输出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.代码必须调用 …
我同时运行相同的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可能以某种方式破坏在另一个进程中进行的写入进程的任何变化?
假设我在文件中定义了一个类:
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基础的字符串表示吗?还是有另一种更规范的方式?
两个快速的熊猫问题供您选择。
我有一个要应用过滤器的数据框列表。
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)作为后续问题,当我创建不同国家的数据框列表时,我注意到了一些奇怪的事情。我定义了列表,然后将转换应用于列表中的每个df。在转换了这些不同的dfs之后,我再次调用了该列表。我很惊讶地看到列表仍然指向未更改的数据帧,因此我不得不重新定义列表以更新结果。有人能解释为什么会这样吗?
如果我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运算符||运行另一个命令。也就是说,我怀疑以下内容可以同时打印one和three,但不能打印出来two:
set -e # Exit on error
fun(){
echo one
non_existing_command
echo two
}
fun || echo three
Run Code Online (Sandbox Code Playgroud)
但是我得到的是one和two。也就是说,||操作员阻止退出(如应有的那样),但它选择继续使用功能主体,而忽略右手命令。
有什么解释吗?
我在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) 我有一些代码使用 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)
旧版本会生成类似的输出,至少可以追溯到 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 模块存在于两个不同版本的同一目录中;mymodule.py和mymodule.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.py和mymodule.so。如果我可以将其替换PathFinder为对文件类型使用相反顺序的类似方法,我将有一个解决方案。
我正在使用 Python 3.7,如果这会影响解决方案。
请注意,简单地读入mymodule.py和exec'ing 它们的源代码行是行不通的,因为mymodule.py它本身可能会导入同样存在于 a.py和.soversion 中的其他模块(我也想导入.py这些模块的版本)。
python ×7
python-3.x ×3
bash ×2
cython ×2
linux ×2
shell ×2
attributes ×1
c ×1
file-writing ×1
function ×1
grep ×1
h5py ×1
hdf5 ×1
import ×1
kill ×1
list ×1
matplotlib ×1
memoryview ×1
milo ×1
opc-ua ×1
pandas ×1
python-2.6 ×1
scatter-plot ×1
typechecking ×1
unix ×1