小编ner*_*com的帖子

ctypes.CDLL() 和 ctypes.cdll.LoadLibrary() 有什么区别?

这两种方法似乎都有效(对我来说),但似乎该CDLL()方法返回一个具有_handle属性的对象,该对象可用于通过ctypes.windll.kernel32.FreeLibrary()(至少在 Windows 上卸载库 - 我还不知道如何在 Linux 上执行此操作) )。

这两种方法有什么区别 - 为什么我要选择其中一种而不是另一种?

最终,我的目标是能够在 Linux 和 Windows 上加载和卸载库(因为我有一个第三方库,有时似乎会进入损坏状态 - 我希望卸载/重新加载能够重置它)。

python ctypes

8
推荐指数
1
解决办法
1万
查看次数

为什么我需要np.array()或np.copy()?

这是一个真正的numpy新手问题.

我有一个名为'image'的numpy数组.这样做:

image2 = image
image2[image < minval] = minval
image2[image > maxval] = maxval
Run Code Online (Sandbox Code Playgroud)

...更改"图片"的内容.

我收集的是因为Python中的变量确实是引用,所以'image2'只是引用'image'的另一种方式.所以我应该使用"image2 = np.copy(image)".精细.

但是,那么,当我这样做时,为什么不"改变":

a = 5
b = a
b = 7
Run Code Online (Sandbox Code Playgroud)

不是'b'只是提到'a'的另一种方式吗?如果是这样,为什么在这个结束时a == 7?

我想知道是否有一些心理模型使这看起来一致.因为它没有.

python numpy

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

重新缩放numpy数组

我有一个2D numpy数组,它表示来自CCD的单色图像,该CCD已经被装箱3x3(也就是说,数组中的每个值代表物理CCD上的9个像素(3x3)).

我想重新缩放它以匹配原始CCD布局(因此我可以使用来自同一CCD的非分箱图像轻松覆盖它).

我看到重新采样一个代表图像的numpy数组,但这似乎没有做我想要的.

假设我有一个数组g:

import numpy as np
import scipy.ndimage

 g = np.array([[0, 1, 2],
               [3, 4, 5],
               [6, 7, 8]])
Run Code Online (Sandbox Code Playgroud)

当我尝试将其缩放2倍时:

o = scipy.ndimage.zoom(g, 2, order=0)
Run Code Online (Sandbox Code Playgroud)

我得到了我所期望的 - 每个值现在是2x2相同的值:

array([[0, 0, 1, 1, 2, 2],
       [0, 0, 1, 1, 2, 2],
       [3, 3, 4, 4, 5, 5],
       [3, 3, 4, 4, 5, 5],
       [6, 6, 7, 7, 8, 8],
       [6, 6, 7, 7, 8, 8]])
Run Code Online (Sandbox Code Playgroud)

但是当我尝试按比例缩放3倍时,我得到了这个:

o = scipy.ndimage.zoom(g, 3, order=0)
Run Code Online (Sandbox Code Playgroud)

给我:

array([[0, 0, 1, 1, …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy

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

两次通过C预处理?

有没有办法让C预处理器(GCC)运行两次通过,以完全扩展宏?

我正在尝试使用引脚的抽象名称来定义支持微控制器上端口I/O的宏:

#define LED_RED E, (1<<6)

#define SetPin(port, mask)    PORT ## port ## SET = (mask)
#define ClearPin(port, mask)  PORT ## port ## CLR = (mask)
#define ReadPin(port, mask)   (PORT ## port) & (mask)
Run Code Online (Sandbox Code Playgroud)

然后在我的代码中:

SetPin(LED_RED);
ClearPin(LED_RED);
result = ReadPin(LED_RED);
Run Code Online (Sandbox Code Playgroud)

这意味着扩展到:

PORTESET = (1<<6);
PORTECLR = (1<<6);
result = (PORTE) & (1<<6);
Run Code Online (Sandbox Code Playgroud)

这不编译 - 我得到:

错误:宏"SetPin"需要2个参数,但只有1个参数.

虽然这确实编译和工作正常:

SetPin(E, (1<<6));
Run Code Online (Sandbox Code Playgroud)

那么......如何让C编译器完全扩展这些宏呢?

或者,如果不是这样,如何使这种事情发挥作用?

c macros gcc c-preprocessor

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

用于控制 ASCOM CCD 相机的 Python 脚本?

我想使用 ASCOM 驱动程序在 Python 中控制 CCD 天文相机,但还没有找到一个示例脚本来展示它是如何完成的。

我想看看相机的基本控制是如何完成的 - 设置曝光长度、开始曝光、下载图像数据。

有人可以发布一个我可以用作起点的示例 Python 脚本吗?

python ascom

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

如何显式推送/弹出到 C 返回堆栈?

有没有办法将数据显式推送/弹出到 C 返回堆栈?(理想情况下在标准 C 中,但仅 GCC 的解决方案也可以。)

我正在用 C 语言实现 Forth,在一个内存非常紧张的微控制器上(千字节,而不是兆字节)。

我正在为数据堆栈分配 RAM,但我希望通过显式推送/弹出与 C 返回堆栈共享 Forth 返回堆栈来节省一些 RAM。

这可以在C中完成吗?

c stack gcc forth

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

如何在 str.format() 中使用宽度和精度变量?

如何使用 str.format() 规范中的变量来确定宽度和精度?

(我在 Python 3 中。)

这工作正常:

print('    {:<127.127}  {:<}'.format(value[1], value[0]))
Run Code Online (Sandbox Code Playgroud)

但这给出了一个错误:

SHOWLEN = 127
print('    {:<SHOWLEN.SHOWLEN}  {:<}'.format(value[1], value[0]))
Run Code Online (Sandbox Code Playgroud)

具体来说,我得到:

Traceback (most recent call last):

  File "C:\Users\Dave\Desktop\index\treeIndex.py", line 101, in <module>
    treeIndex(sys.argv[1])

  File "C:\Users\Dave\Desktop\index\treeIndex.py", line 96, in treeIndex
    print('    {:<SHOWLEN.SHOWLEN}  {:<}'.format(value[1], value[0]))

ValueError: Invalid format specifier
Run Code Online (Sandbox Code Playgroud)

如何为精度和宽度使用变量?

python string-formatting python-3.x

4
推荐指数
1
解决办法
767
查看次数

嵌套Python模块导入的最佳实践

假设我有一个Python模块"main.py":

import math           # from the standard Python library
import my_own_module

...

foo = math.cos(bar)
Run Code Online (Sandbox Code Playgroud)

我还需要在"my_own_module.py"中导入标准数学模块:

import math

...

baz = math.sin(qux)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我认为import math"main.py"是多余的,可以省略.

在这种情况下,最佳做法是什么:

  1. 忽略import math"main.py"因为它是多余的?要么,
  2. 保留import math在"main.py"中以澄清该模块中的代码是否需要它?

python python-import

4
推荐指数
1
解决办法
106
查看次数

在C预处理器中比较字符串的方法?(海湾合作委员会)

有没有更好的方法来做到这一点(在 GCC C 中)?

我试图定义一些代表硬件平台的符号,用于条件编译。

但我也想要描述硬件的可打印字符串(用于诊断)。

理想情况下,我希望能够做到:

#define HARDWARE "REV4C"

#if (HARDWARE == "REV4C")
    #define LED_RED      // define pin addresses, blah blah...
#endif

printf("HARDWARE %s\n", HARDWARE);
Run Code Online (Sandbox Code Playgroud)

但我不认为这在 C 中是允许的。这有效,但它很难看:

#define REV4C   (403)    // symbols for conditional compilation
#define REV421  (421) 

//#define HARDWARE REV4C // choose hardware platform (just one)
#define HARDWARE REV421

#if (HARDWARE == REV421) // define strings for printing
    #define HARDWARE_ID "REV421"
#elif (HARDWARE == REV4C)
    #define HARDWARE_ID "REV4C"
#else
    #define HARDWARE_ID "unknown"
#endif

#if (HARDWARE == REV421) …
Run Code Online (Sandbox Code Playgroud)

c gcc c-preprocessor

3
推荐指数
1
解决办法
6368
查看次数

为什么del <object>没有删除它?

下面的代码创建了一个"tee"对象,它将stdout发送到文件以及终端.

如果del t在我完成T恤时如下所示,则不会删除该对象,并且不会__del__()调用该成员(因此继续进行):

t = tee("foo.txt")
print("bar")
del t
Run Code Online (Sandbox Code Playgroud)

但如果我__del__()直接打电话,事情就好了:

t = tee("foo.txt")
print("bar")
t.__del__()
Run Code Online (Sandbox Code Playgroud)

为什么不del工作?这样做的正确方法是什么?

class tee():
    def __init__(self, filepath):
        self.old_stdout = sys.stdout
        self.old_stderr = sys.stderr
        self.name = filepath

        sys.stdout = self
        sys.stderr = self

    def write(self, text):
        self.old_stdout.write(text)
        with open(self.name, 'a',  encoding="utf-8") as f:
           f.write(text)

    def flush(self):
        pass

    def __del__(self):
        sys.stdout = self.old_stdout
        sys.stdout = self.old_stderr
Run Code Online (Sandbox Code Playgroud)

python

3
推荐指数
1
解决办法
77
查看次数