小编Jos*_*lin的帖子

异步将stdout/stdin从嵌入式python重定向到c ++?

我本质上是在尝试编写一个带有输入和输出的控制台接口,用于嵌入式python脚本.按照这里的说明,我能够捕获标准输出:

Py_Initialize();
PyRun_SimpleString("\
class StdoutCatcher:\n\
    def __init__(self):\n\
        self.data = ''\n\
    def write(self, stuff):\n\
        self.data = self.data + stuff\n\
import sys\n\
sys.stdout = StdoutCatcher()");

PyRun_SimpleString("some script");

PyObject *sysmodule;
PyObject *pystdout;
PyObject *pystdoutdata;    
char *string;
sysmodule = PyImport_ImportModule("sys");
pystdout = PyObject_GetAttrString(sysmodule, "stdout");
pystdoutdata = PyObject_GetAttrString(pystdout, "data");    
stdoutstring = PyString_AsString(pystdoutdata);

Py_Finalize();
Run Code Online (Sandbox Code Playgroud)

这里的问题是,我只收到了标准输出的脚本运行完毕后,而理想的控制台stdoutstring将更新为Python脚本更新它.有没有办法做到这一点?

另外,我将如何捕获stdin?

如果它有帮助,我正在使用接受Objective-C的编译器.我也有提升库.


我已经找到了问题的标准部分.对于后代,这有效:

static PyObject*
redirection_stdoutredirect(PyObject *self, PyObject *args)
{
    const char *string;
    if(!PyArg_ParseTuple(args, "s", &string))
        return NULL;
    //pass string onto somewhere
    Py_INCREF(Py_None);
    return Py_None;
}

static …
Run Code Online (Sandbox Code Playgroud)

c++ python console stdin stdout

13
推荐指数
1
解决办法
3181
查看次数

如何在不同类型的注释中引用相同的类型变量?

说我有以下内容:

import Control.Monad.Random

foo :: IO Float
foo = fmap realToFrac getRandom
Run Code Online (Sandbox Code Playgroud)

GHC正确地抱怨不知道其类型getRandom; 我可以解决这个问题

foo = fmap realToFrac (getRandom :: IO Double)
Run Code Online (Sandbox Code Playgroud)

但是,请考虑我所拥有的情况:

foo :: (Functor m, MonadRandom m) => m Float
foo = fmap realToFrac getRandom
Run Code Online (Sandbox Code Playgroud)

我做不到

foo = fmap realToFrac (getRandom :: m Double)
Run Code Online (Sandbox Code Playgroud)

我必须重复这个MonadRandom约束:

foo = fmap realToFrac (getRandom :: MonadRandom m => m Double)
Run Code Online (Sandbox Code Playgroud)

由于存在大量约束,这将导致大量额外输入.我宁愿不必那样做.我知道我可以使用ScopedTypeVariables:

{-# LANGUAGE ScopedTypeVariables #-}

import Control.Monad.Random

foo :: MonadRandom m => m Float
foo = …
Run Code Online (Sandbox Code Playgroud)

haskell

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

是否存在"非"约束运算符这样的事情?

假设我想编写一个函数来展平列表,列表列表,列表列表等等.我可以写下面的内容:

{-# LANGUAGE TypeFamilies #-}
class Flattenable a where
  type Flattened a
  flatten :: a -> Flattened a

instance NotFlattenable a => Flattenable [a] where
  type Flattened [a] = [a]
  flatten = id

instance Flattenable a => Flattenable [a] where
  type Flattened [a] = Flattened a
  flatten = concat . map flatten
Run Code Online (Sandbox Code Playgroud)

其中NotFlattenable a一些约束来限制那些a没有的一个实例Flattenable.是NotFlattenable合法的约束吗?我该怎么写呢?(注意,没有NotFlattenable约束会使两个实例重叠)

haskell constraints typeclass

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

标签 统计

haskell ×2

c++ ×1

console ×1

constraints ×1

python ×1

stdin ×1

stdout ×1

typeclass ×1