如何从 CasperJS 调用 python 脚本

How to call python script from CasperJS

我正在尝试从 CasperJS 中调用 python 脚本并获取 python 的输出。

casp = require('casper').create({
    verbose: true,
    logLevel: 'debug'
});

casp.start().then(function() {
  var cp = require('child_process');
    cp.execFile('/usr/bin/python','test.py', {},function(_,stdout,stderr){
        console.log(stdout);
        console.log(stderr);
    });
});

casp.run();

test.py 只是用于测试的 print "hello world" atm,但是当我 运行 时这个脚本在没有 运行 宁 python 的情况下就退出了。

如果我用 --version 替换 test.py 参数,例如

cp.execFile('/usr/bin/python','--version', {},function(_,stdout,stderr){

然后就正确获取到版本信息了。我认为这一定是在 execFile 中如何传递参数的问题,但不确定我应该做什么。

问题是你提前退出了。一个空的 casper.run() 意味着它会在所有 casper 步骤执行完后立即退出。 child_process 模块不是 CasperJS 模块(它由 PhantomJS 提供)所以它不知道它正在执行。

您可以简单地使用

casp.run(function(){});

防止退出。但是你可能需要终止 CasperJS 进程。

更好的方法是在执行完成时设置一个变量,然后才继续:

casp.start().then(function() {
  var finished = false;
  var cp = require('child_process');
  cp.execFile('/usr/bin/python','test.py', {},function(_,stdout,stderr){
    console.log(stdout);
    console.log(stderr);
    finished = true;
  });
  this.waitFor(function check(){
    return finished;
  }, function then(){
    // can stay empty
  });
}).run();

如果要将多个参数传递给外部程序,应该使用数组作为 execFile

的第二个参数