小编Pet*_*aut的帖子

如何在for循环迭代器中捕获异常

这是forPython中的循环:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
Run Code Online (Sandbox Code Playgroud)

通常,当从中产生值时expression_list会引发异常,循环将中止.是否有一种优雅的方式(没有重写循环使用while True或类似的东西)来捕获此异常并继续循环?

这是一个例子:

import csv

csv.field_size_limit(10)

reader = csv.reader(open('test.csv', 'r'))
for line in reader:
    print(line)
Run Code Online (Sandbox Code Playgroud)

用这个文件:

foo,bar,baz
xxx,veryverylong,yyy
abc,def,ghi
Run Code Online (Sandbox Code Playgroud)

这在第二行中止.我想要一种方法来跳过或记录失败的行并继续.

python exception

30
推荐指数
2
解决办法
2万
查看次数

如何在Perl中找到require'd文件的文件名?

如何在该文件中找到require'd' 文件的名称?我可以查看%INC找到所有已加载文件的名称,但我正在寻找类似的东西$0作为关键%INC.

perl

9
推荐指数
1
解决办法
166
查看次数

如何在食谱编译时阅读食谱文件?

这种事情在厨师食谱中很常见:

%w{foo bar baz}.each do |x|
  file "#{x}" do
    content "whatever"
  end
end
Run Code Online (Sandbox Code Playgroud)

但我想读取与菜谱保存的文件循环的项目,例如:

File.open('files/default/blah.txt').each do |x|
  file "#{x}" do
    content "whatever"
  end
end
Run Code Online (Sandbox Code Playgroud)

如果我给出了blah.txtchef-client碰巧缓存它的完整路径,那么这是有效的,但它不可移植.如果我像在示例中那样编写它,它"无效","希望"当前目录是cookbook的根目录.有没有办法在编制食谱时获取cookbook根目录?

chef-infra

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

如何在GNU/Linux上链接插件时巧妙地检测未定义的符号?

我有一个foo可以通过加载插件的程序dlopen().我正在编写一个这样的插件foobar,它与第三方库提供的功能接口libfoo.

在Linux上,我是这样构建的foobar:

gcc -fpic -c -o foobar.o foobar.c
gcc -fpic -shared -o foobar.so foobar.o -lbar
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

问题是,这不会检测未定义的符号,例如由于代码中的错误或头文件和库之间的不匹配.链接成功,您只有在加载插件或在插件中调用某些内容时才会收到错误(取决于dlopen()标志).

要检测共享库中的未定义符号,通常可以使用-Wl,-z,defs或者使用-Wl,--no-allow-shlib-undefined.但这会失败,因为它还会报告应该foo在运行时在程序中找到的符号.我想检测未定义的符号,但托管程序提供的符号除外.

例如,在Mac OS X上,这可以通过-bundle_loader选项完成.等效的链接命令将是

gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo
Run Code Online (Sandbox Code Playgroud)

并以我想要的方式检测未定义的符号.

如何在GNU/Linux或GNU ld上执行此操作?(我查看了ld手册页中列出的所有选项,但没有一个看起来很有希望.)

c linux macos linker ld

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

如何使用 typeof_unqual 避免编译器关于丢弃 const 限定符的警告

在下面的代码中,copyThing()编写了其返回值与其参数值具有相同类型的代码:

extern void *copyThingImpl(const void *x);

#define copyThing(x) ((typeof(x)) copyThingImpl(x))

void foo(void);

void foo(void)
{
    char *x = "foo";
    char *y;

    y = copyThing(x);
    (void) y;
}
Run Code Online (Sandbox Code Playgroud)

这使用了广泛可用的typeof运算符。这工作正常并且编译时没有警告(例如,gcc -Wall -O2 -c test.c)。

现在,如果我们改为x指针const,我们会遇到一些小问题:

extern void *copyThingImpl(const void *x);

#define copyThing(x) ((typeof(x)) copyThingImpl(x))

void foo(void);

void foo(void)
{
    const char *x = "foo";
    char *y;

    y = copyThing(x);
    (void) y;
}
Run Code Online (Sandbox Code Playgroud)

这会导致警告:

warning: assignment discards 'const' qualifier from pointer target type …
Run Code Online (Sandbox Code Playgroud)

c constants typeof c23

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

如何在vagrant中覆盖Chef节点名称?

我正在开发一个厨师食谱,我正在用Vagrant和厨师独奏进行测试.食谱看待node.name做出某些决定.为了测试它的各种变体,我想覆盖来自Vagrant的测试运行的该属性.所以我试过了

Vagrant.configure("2") do |config|
  ...
  config.vm.provision :chef_solo do |chef|
    ...
    chef.json = {
      'name' => 'randomhostname',
    }
  end
end
Run Code Online (Sandbox Code Playgroud)

但似乎没有效果.

我理解该name属性默认为hostname属性,由ohai管理(另请参阅此问题),但有没有办法覆盖name属性?

chef-infra vagrant chef-solo

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

PGError:错误:列"p.name"必须出现在GROUP BY子句中或用于聚合函数

我的查询出错了.为什么?我不明白:(

    SELECT p.name, p.id, SUM(hours) AS hours, SUM(logged_hours) AS logged_hours
    FROM (
        SELECT project_id, date, hours, null AS logged_hours
        FROM #{ScheduleEntry.table_name}
        WHERE user_id = #{User.current.id}
            AND date BETWEEN '%s' AND '%s'
        UNION
        SELECT project_id, spent_on AS date, null AS hours, sum(#{TimeEntry.table_name}.hours) AS logged_hours
        FROM #{TimeEntry.table_name}
        WHERE user_id = #{User.current.id}
            AND spent_on BETWEEN '%s' AND '%s'
        GROUP BY project_id, date
    ) AS results
    LEFT JOIN #{Project.table_name} AS p ON p.id = results.project_id
    GROUP BY project_id
Run Code Online (Sandbox Code Playgroud)

postgresql redmine

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

拦截Wget输出

我有一个我想要下载的.php文件,它会显示一个4位数字.无论如何在没有wget回显到外部文件的情况下检索此输出,然后读取外部文件并删除外部文件.

就像是..

OUTPUT=`wget www.google.com`
print $OUTPUT
Run Code Online (Sandbox Code Playgroud)

它会获得google.com的文本

bash wget

2
推荐指数
1
解决办法
3969
查看次数

标签 统计

c ×2

chef-infra ×2

bash ×1

c23 ×1

chef-solo ×1

constants ×1

exception ×1

ld ×1

linker ×1

linux ×1

macos ×1

perl ×1

postgresql ×1

python ×1

redmine ×1

typeof ×1

vagrant ×1

wget ×1