小编red*_*dot的帖子

python:获取实际环境变量以修改并传递给子进程

好吧,似乎环境变量的情况在python中不一致。

在导入模块时使用os.environos.getenv返回 env 的状态来读取环境变量并不是什么秘密os。仍然可以使用分配给os.environ键来更新环境。

但是一旦我使用os.putenv或运行任何修改环境的 ctypes 代码,我就会发现实际进程环境和os.environ. Nuff 说,这个实际的环境将被保留给子进程,无论是用创建的os.system还是subprocess库的。就我而言,这是理想的行为。

现在我想查看和更改传递给子流程的环境。通常建议获取 的副本os.environ,修改它并作为参数传递以进行subprocess.Popen调用。但在这种情况下,由 ctypes 代码对环境所做的更新将丢失。

有没有办法克服这个问题?严格来说,有没有办法重新加载 os.environ 或使用其他工具获取具有实际环境的副本?

python subprocess environment-variables

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

检查mmap的地址是否正确

我正在编写一个高负载的守护进程,它应该在FreeBSD 8.0和Linux上运行.守护程序的主要目的是传递其标识符请求的文件.通过对db的请求将标识符转换为本地文件名/文件大小.然后我使用顺序mmap()调用来传递文件块send().

但是有时文件系统中的db和filesize中的文件大小不匹配(realsize <db中的大小).在这种情况下,我发送了所有实际数据块,当下一个数据块被映射时 - mmap没有返回任何错误,只是通常的地址(我也检查过errno变量,它在mmap之后等于零).当守护进程尝试发送此块时,它会获得Segmentation Fault.(在FreeBSD 8.0 amd64上保证发布此行为)

我打开前使用安全检查以确保stat()通话时的尺寸.然而现实生活告诉我,在罕见的情况下仍然可以提升段错误.

所以,我的问题是有一种方法可以在解除引用之前检查指针是否可访问?当我在gdb中打开核心时,gdb说给定地址超出范围.可能有人可以提出另一个解决方案.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

#define FILENAME        "./datafile"

int main()
{
    unsigned long i, j;

    srand(time(NULL));
    unsigned long pagesize = sysconf(_SC_PAGESIZE);

    unsigned long basesize = 4 * pagesize;
    unsigned long cropsize = 2 * pagesize;

    // create 4*pagesize sized file
    int f = creat(FILENAME, 0644);
    for (i = 0; i < basesize; …
Run Code Online (Sandbox Code Playgroud)

c high-load freebsd mmap segmentation-fault

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

管道到头部导致从python调用的shell脚本中的管道损坏

我有一个命令,我将运行生成随机字符串:

var=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8`
Run Code Online (Sandbox Code Playgroud)

当我在交互式bash会话中运行此命令时,我绝对没有错误.但是,当我将此命令放入脚本并将其作为脚本运行时,我得到了由tr指示的Broken pipe错误.我已经阅读了几个相关的主题,但仍然没有答案为什么脚本和交互行为是不同的,有没有办法用shell选项或其他东西来控制它?

编辑I:

关于给出的评论,我发现可以通过以下方式控制指示损坏的管道错误:

 trap - SIGPIPE # to ignore errors
Run Code Online (Sandbox Code Playgroud)

 trap "" SIGPIPE # to display errors
Run Code Online (Sandbox Code Playgroud)

编辑二:

好吧,我提供了有关复制条件的错误信息.最后,似乎python包装器使用os.system()调用脚本引起的问题:

 python -c "import os; os.system('sh -c \"< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8\"')"
Run Code Online (Sandbox Code Playgroud)

给定的行产生与使用的OS无关的管道错误.

编辑III:

这个主题在这里讨论过:https: //mail.python.org/pipermail/python-dev/2005-September/056341.html

python bash shell pipe head

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

Linux上的软件串口环回

目前,我需要开发一些程序,通过串行线路与cisco设备进行通信.我想在我的开发linux机器上构建测试环境.所以,我找到了dynamips cisco模拟器.该仿真器可以通过串行线提供"-U/dev/ttyS0"选项.好吧,这会导致dynamips打开硬件串口并通过它进行通信.我能够通过串口客户端(如minicom)从另一台Linux机器连接到这个硬件串口.

但是,由于我在两台linux机器上都使用了virtualbox,我通过virtualbox将串口转发到命名管道.这个方案似乎有效,但非常冗长.我正在寻找一种在单个linux机器上运行dynamips和minicom的方法.

我发现伪终端在我的情况下可能很有用.但是我试图用'-U/dev/ptmx'运行dynamips,然后用minicom连接创建/ dev/pts/...端口,反之亦然.在这两种情况下,我都有输入/输出错误.

linux serial-port loopback pty

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

使用无点表示法定义`id`函数

在Haskell语言函数中id定义为组合单位:

id :: a -> a
id x = x
Run Code Online (Sandbox Code Playgroud)

有没有办法id使用无点表示法定义haskell' 函数?我的意思是不要像以下那样直接引用它:

same :: a -> a
same = id
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming pointfree

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