Python pwd模块提供对getpwnam(3)POSIX API的访问,POSIX API可用于通过用户名获取特定用户的主目录,以及确定用户名是否有效. pwd.getpwnam如果使用不存在的用户名调用,则会引发异常.
起初,似乎可以通过跨平台方式实现相同的结果os.path.expanduser('~username').但是,似乎在Windows XP上使用Python 2.6,这实际上不会导致不存在的用户名失败.此外,在Windows XP上的Python 2.5上,即使对于有效用户来说似乎也失败了.
可以在Windows上可靠地获取此信息吗?怎么样?
我是python和扭曲的新手,我试图运行一个简单的扭曲脚本但失败了.
我的环境:
MacOX 10.7.2 + Python 2.7.1 + Twisted 11.0.0 + eclipse + PyDev
该脚本名为test.py:
from twisted import reactor
reactor.run()
Run Code Online (Sandbox Code Playgroud)
我试着在终端上运行它,一切正常.
然后我打开eclipse并创建了一个新的PyDev项目,然后添加了一个名为test.py的py文件并输入上面的代码.
当我试图运行它时,我得到的错误如下:
Traceback (most recent call last):
File "/Users/user/Documents/workspace/TwistedDemo/test.py", line 2, in <module>
from twisted import reactor
ImportError: No module named twisted
Run Code Online (Sandbox Code Playgroud)
然后我检查了PYTHONPATH并在外部库选项卡中添加了"扭曲的源文件夹",但错误仍然存在.(没有改变)
希望有人可以帮助我,在此先感谢:)
from twisted.internet import reactor
from twisted.internet import threads
from twisted.internet import defer
import time
def worker(arg):
print 'Hello world'
time.sleep(10)
return 1
def run():
print 'Starting workers'
l = []
for x in range(2):
l.append(threads.deferToThread(worker, x))
return defer.DeferredList(l)
def res(results):
print results
reactor.stop()
d = run()
d.addCallback(res)
reactor.run()
如何通过超时停止工人?
扭曲包括在顶部实施的反应堆MsgWaitForMultipleObjects.显然,反应堆在TCP连接何时结束时可靠地注意到,至少在对等体发送一些字节然后快速关闭连接的情况下.似乎发生的事情是:
MsgWaitForMultipleObjects一些套接字句柄和QS_ALLINPUT.MsgWaitForMultipleObjects再次调用.MsgWaitForMultipleObjects永远不再表示句柄处于活动状态.TCP实现永远不会再次查看套接字,因此它永远不会检测到连接已关闭.这使它看起来好像MsgWaitForMultipleObjects是边缘触发的通知机制.在MSDN文档说:
Waits until one or all of the specified objects are in the signaled state
or the time-out interval elapses.
Run Code Online (Sandbox Code Playgroud)
这听起来不像是边缘触发.这听起来像是水平触发.
是MsgWaitForMultipleObjects实际边沿触发?或者它是否被水平触发,这种不当行为是由其行为的其他方面引起的?
附录 WSAEventSelect的MSDN文档解释了这里发生了什么,包括指出这FD_CLOSE基本上是一次性事件.在发出一次信号之后,你再也不会得到它了.这在某种程度上解释了为什么Twisted有这个问题.不过,我仍然有兴趣听听如何有效地使用MsgWaitForMultipleObjects这个限制.
单元测试用C编写的Python扩展模块是相当简单的(如果单调乏味),包括许多Python/C API的错误情况,例如PyArg_ParseTuple.例如,启动实现Python函数或方法的C函数的惯用方法如下:
if (!PyArg_ParseTuple(args, "someformat:function_name")) {
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
通过使用正确的参数数量和类型调用函数,可以对此成功案例进行单元测试.也可以通过首先使用错误数量的参数调用函数来测试失败情况,然后调用正确数量的参数,但传递错误类型的值.这导致C代码的完整分支测试覆盖.
但是,目前尚不清楚如何为其他Python/C API运用否定路径.在C扩展中开始模块初始化的惯用方法如下:
if (PyType_Ready(&Some_Extension_Structure) < 0) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
怎么可能PyType_Ready失败?类似地,用于分配扩展类型的新实例的C函数经常使用如下API PyObject_New:
self = PyObject_New(Some_Structure, &Some_Extension_Structure);
if (self == NULL) {
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
一个单元如何测试这种负面情况(特别是考虑PyObject_New到在单个单元测试方法的执行过程中可能会使用很多次?)
似乎有可能构建一个通用的解决方案,依赖于动态链接器技巧,例如LD_PRELOAD提供这些C API的假货,这些C API可以在正确的时间以正确的方式指向失败.但是,构建这样的系统的成本似乎有点遥不可及.有其他人已经完成它并使结果可用吗?
是否有特定于Python/C的技巧可以使这种测试更容易?
我应该完全考虑其他一些方面吗?
我有一个基于堆栈的项目,它依赖于几个 C 库。其中一个 C 库 zlib 可从原生 NixOS 包中获得,我可以将其放入 stack.yaml 的 nix 部分:
nix:
enable: true
packages:
- "zlib"
Run Code Online (Sandbox Code Playgroud)
另一个不是nixpkgs 的一部分。堆栈文档建议使用 中的nix部分的替代方法stack.yaml是“编写 shell.nix”而无需详细说明。
于是写了一篇,坚持以zlib为例:
{ pkgs ? import <nixpkgs> { } }:
pkgs.mkShell {
buildInputs = [
pkgs.pkgconfig
pkgs.zlib
pkgs.stack
];
}
Run Code Online (Sandbox Code Playgroud)
这为我提供了 zlib 的工作 pkg-config:
[nix-shell:~/Work/PrivateStorage/PaymentServer]$ pkg-config --modversion zlib
1.2.11
Run Code Online (Sandbox Code Playgroud)
但是,似乎并没有让堆栈能够找到库:
[nix-shell:~/Work/PrivateStorage/PaymentServer]$ stack build
zlib-0.6.2: configure
Progress 1/7
-- While building package zlib-0.6.2 using:
/home/exarkun/.stack/setup-exe-cache/x86_64-linux-nix/Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5 --builddir=.stack-work/dist/x86_64-linux-nix/Cabal-2.4.0.1 configure --with-ghc=/nix/store/zfpm9bai9gj8vs09s2i2gkhvgsjkx13z-ghc-8.6.5/bin/ghc --with-ghc-pkg=/nix/store/zfpm9bai9gj8vs09s2i2gkhvgsjkx13z-ghc-8.6.5/bin/ghc-pkg --user --package-db=clear --package-db=global --package-db=/home/exarkun/.stack/snapshots/x86_64-linux-nix/lts-14.1/8.6.5/pkgdb …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Terraform 来管理一些 GitLab(自托管)配置。Terraform GitLab 提供程序需要一个 GitLab 个人访问令牌才能进行 API 调用以读取和写入配置。当我尝试使用 Terraform 提供此令牌时,secret_resourceTerraform 无法让我管理秘密。当我尝试导入机密时,Terraform 失败:
$ terraform import secret_resource.api_token "xxx"
secret_resource.api_token: Importing from ID "xxx"...
secret_resource.api_token: Import prepared!
Prepared secret_resource for import
secret_resource.api_token: Refreshing state... [id=-]
Error: GET https://gitlab.example.com./api/v4/user/api/v4/user: 404 {error: 404 Not Found}
on /path/to/providers.tf line 24, in provider "gitlab":
24: provider "gitlab" {
Run Code Online (Sandbox Code Playgroud)
这是重现此行为的最小 Terraform:
terraform {
required_version = "~> 0.13.6"
required_providers {
gitlab = {
source = "nixpkgs/gitlab"
version = "> 3.4.99"
}
secret = { …Run Code Online (Sandbox Code Playgroud) credentials terraform terraform-provider-gitlab terraform-provider-secrets
我的自托管 GitLab 部署上的作业最近有时开始失败,并出现以下 git 错误:
完整作业日志的示例如下:
Running with gitlab-runner 13.12.0 (v13.12.0)
on ....50ab V...
Preparing the "shell" executor
00:00
Using Shell executor...
Preparing environment
00:00
Running on saxtons...
Getting source from Git repository
00:03
$ /nix/store/s0frm5z2k43qm66q39ifl2vz96hmyxg4-pre-clone
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /var/lib/private/gitlab-runner/builds/V.../2/privatestorage/PrivateStorageio/.git/
fatal: shallow file has changed since we read it
Cleaning up file based variables
00:00
ERROR: Job failed: exit status 1
Run Code Online (Sandbox Code Playgroud)
预克隆脚本包含此内容,用于修复不可写目录的权限,这些目录会导致运行程序尝试清理 git checkout 失败:
chmod --recursive u+rwX …Run Code Online (Sandbox Code Playgroud) 我有一些状态通过转移概率链接(嵌入在马尔可夫链中的转换矩阵中).我想通过仅考虑足够高的概率来总结这个转移矩阵,它们允许从一个状态(〜节点)转到另一个状态(在我的转换矩阵中的第一个和最后一个).一个阈值,这样如果我只考虑更高的概率,我的转换矩阵永远不会允许从第一个状态(或节点)移动.
两个问题:
是否有一些众所周知的库(优先是python语言)实现这种方法?我的天真/经验/原型方法将是一个减少阈值的循环,然后检查我是否可以从第一个状态流到最后一个状态(距离矩阵中的最佳路径算法?).但这可能需要非常高的计算时间?
Example 1:
DistMatrix = [[ 'a', 'b', 'c', 'd'],
['a', 0, 0.3, 0.4, 0.1],
['b', 0.3, 0, 0.9, 0.2],
['c', 0.4, 0.9, 0, 0.7],
['d', 0.1, 0.2, 0.7, 0]]
states are a,b,c,d. I want to find the value (threshold) that allow to go from a to d (no matter if other states are walked)
Naive approach:
- first loop: threshold 0.9, I get rid of lesser probabilities: I can only connect c and b
- second …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 GitLab 加载用户信息,以便我可以将用户名与问题相关联。查询问题时,受让人用户名不是直接可用的。相反,用户 ID 可用。
如果我使用/-/graphql-explorerGitLab 部署上的端点执行此 GraphQL 查询:
query {
users {
nodes {
id
name
username
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后返回 91 个用户。不过,这显然不是部署中的所有用户。我知道有些用户存在,但未包含在结果中。我可以使用这个 GraphQL 查询单独查询它们:
query {
user(username: "someusername") {
id
}
}
Run Code Online (Sandbox Code Playgroud)
并收到似乎正确描述用户的结果。
为什么此查询的结果中省略了某些用户?我知道大型结果集需要处理分页,但默认页面大小应该是 100,我收到的结果比这少。此外,如果我pageinfo在结果之后请求并询问用户,endCursor我将不会收到任何物品。
如何提交查询以获取所有用户?如果做不到这一点,我如何提交一个查询来获取所有可能是 aa 组的受让人(或者,如果失败,则是项目列表)的所有用户?
python ×6
gitlab ×2
nixos ×2
twisted ×2
windows ×2
analysis ×1
c ×1
credentials ×1
git ×1
gitlab-api ×1
gitlab-ci ×1
graphql ×1
haskell ×1
networking ×1
networkx ×1
pkg-config ×1
pydev ×1
reactor ×1
terraform ×1
unit-testing ×1