我将这个问题加上前缀:不,设置IRONPYTHONPATH不是答案.
无论如何...
我计划使用IronPython作为项目的Powershell的替代品,但在我开始之前我一直都很难过.
我尝试做的第一件事是使用os.path,结果是:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named os
Run Code Online (Sandbox Code Playgroud)
搞砸了我终于发现我可以通过手动添加到路径来使用标准库:
import sys
sys.path.append(r"C:\Program Files\IronPython 2.7\Lib")
import os
Run Code Online (Sandbox Code Playgroud)
然而,这是一个愚蠢的想法.在我的脚本中硬编码python库的路径是一种100%保证的方式,使它们在某些时候不起作用.
当我尝试在Windows 7机器上使用脚本并且路径略有不同时('Program Files(x86)'),我几乎立即发现了这一点.
所以,这里有几个问题:
1)为什么使用标准库这么难?至少我会想到VS中的交互式提示和基本的ipy.exe会有这个.
2)无论我使用何种系统,如何确定安装铁python的目录?(IronPython安装程序设置var也许?)
这里只是一个注释; 是的,我看过其他一些帖子说"设置你的IRONPYTHONPATH".这无益.如果我有一台空机,这意味着我必须:
1)安装IronPython
2)运行一些疯狂的PowerShell脚本来搜索标准库的安装位置,并为其设置一个全局IRONPYTHONPATH变量.
3)运行python脚本
我正在寻找更好的方法.
-
编辑:
事实上,我使用它来做类似于powershell的事情基本上是无关紧要的,但我正在尝试实现类似的东西:
import clr
from System.Management.Automation import RunspaceInvoke
import os
scriptRoot = os.getcwd()
runSpace = RunspaceInvoke()
cmdPath64 = os.join(scriptRoot, "..\java\...")
cmdPath32 = os.join(scriptRoot, "..\java\...")
proc = runSpace.Invoke("Get-WmiObject Win32_Processor ... ")
if proc.AddressWidth == 32: …Run Code Online (Sandbox Code Playgroud) 我已经查看了锈外部函数接口,并成功(并且愉快地)可以从我的锈色代码中调用ac库.
但是,我似乎无法在c代码范围内找到有关如何注册回调以调用生锈代码的任何细节.
这甚至可能吗?
作为"为什么你会这样做?"的理由; 具体来说,我正在考虑在生锈应用程序中嵌入lua或python,并为在嵌入式运行时上运行的脚本公开脚本api.
调用这些将是以下内容:
所有这些步骤除了粗体之外我已经设法工作,并且我使用调度程序完成了一些简单的工作,C调用将"运行我"命令转储到队列中,当控制返回到生锈范围,应用程序查询队列并运行其中的命令...
...但是从脚本方面来说有点尴尬,因为它意味着多个嵌套的异步回调,而脚本层的重点是简化需要进入脚本层的代码.
那么,另一个问题(如何使用typescript 导入模块)的一般答案是:
1)创建一个blah.d.ts定义文件.
2)使用:
/// <reference path="./defs/foo/foo.d.ts"/>
import foo = require("foo");
Run Code Online (Sandbox Code Playgroud)
关键的是,你需要在 node_modules中的某个地方加载文件foo.d.ts和foo.js; 并且 NAME foo必须与两者完全匹配.现在...
我想回答的问题是如何编写一个可以用这种方式导入的打字稿模块?
可以说我有一个这样的模块:
- xq/
- xq/defs/Q.d.ts
- xq/index.ts
- xq/base.ts
- xq/thing.ts
Run Code Online (Sandbox Code Playgroud)
我想从base.ts导出模块'xq'和'Base'类,从thing.ts导出'Thing'.
如果这是javascript中的节点模块,我的index.ts看起来像:
var base = require('./base');
var thing = require('./thing');
module.exports = {
Base: base.Base,
Thing: thing.Thing
};
Run Code Online (Sandbox Code Playgroud)
让我们尝试使用类似的打字稿文件:
import base = require('./base');
export module xq {
export var base = base.Base;
}
Run Code Online (Sandbox Code Playgroud)
调用它:
tsc base.ts index.ts things.ts ... --sourcemap --declaration --target ES3
--module commonjs --outDir …Run Code Online (Sandbox Code Playgroud) 我最初假设您可以这样做,因为文档(http://doc.rust-lang.org/rust.html#implementations)建议您可以:
trait Bar<T> {
fn ex(&self) -> T;
}
struct Foo {
y:f64
}
impl Bar<int> for Foo {
fn ex(&self) -> int {
return self.y.floor() as int;
}
}
impl Bar<uint> for Foo {
fn ex(&self) -> uint {
if (self.y < 0.0) {
return 0u;
}
return self.y.floor() as uint;
}
}
Run Code Online (Sandbox Code Playgroud)
......但这似乎不起作用.我得到的错误如下:
error: multiple applicable methods in scope
error: expected Bar<uint>, but found Bar<int> (expected uint but found int)
error: expected Bar<int>, but found Bar<uint> …Run Code Online (Sandbox Code Playgroud) 是否有标准库的一部分?
我一直在挖掘,但我看不到任何立即明显的实现它,或任何东西Process可以让你这样做?
我错过了吗?或者我是否必须为此功能执行一些C-wrapper工作?
(如果是这样,序列化一个对象Send并将其传递给另一个进程是否"安全" ,然后在那里反序列化?那是什么Send意思?)
一般来说,我相信我理解这样做的一种方式:
CommandStdio::piped()创建一个新的对输出流command.stdout(),和command.stderr()听起来不错吗?
我的两个实际问题:
是否有一种更简单的方法,不涉及每个进程的"读取线程"?
如果没有更简单的方法,Read::read()需要&mut self; 你如何将它传递到远程线程?
请提供有关如何实际流式传输输出的具体示例,而不仅仅是有关如何执行此操作的通用建议...
更具体地说,这是使用的默认示例spawn:
use std::process::Command;
let mut child = Command::new("/bin/cat")
.arg("file.txt")
.spawn()
.expect("failed to execute child");
let ecode = child.wait()
.expect("failed to wait on child");
assert!(ecode.success());
Run Code Online (Sandbox Code Playgroud)
如何更改上面的示例以将child的输出流式传输到控制台,而不是仅仅等待退出代码?
&[T] 令我困惑.
我天真地认为像&T,&[T]是一个指针,这就是说,一个数字指针地址.
但是,我已经看到了一些像这样的代码,我看到工作正常(为了演示目的而简化;但是你在许多'as_slice()'实现中看到这样的代码)我感到非常惊讶:
extern crate core;
extern crate collections;
use self::collections::str::raw::from_utf8;
use self::core::raw::Slice;
use std::mem::transmute;
fn main() {
let val = "Hello World";
{
let value:&str;
{
let bytes = val.as_bytes();
let mut slice = Slice { data: &bytes[0] as *const u8, len: bytes.len() };
unsafe {
let array:&[u8] = transmute(slice);
value = from_utf8(array);
}
// slice.len = 0;
}
println!("{}", value);
}
}
Run Code Online (Sandbox Code Playgroud)
所以.
我最初认为这是无效的代码.
也就是说,在Slice块作用域内创建的实例将返回到块作用域之外(通过转换),尽管代码运行,但println!实际上是通过不安全指针访问不再有效的数据.坏!
......但似乎并非如此.
考虑评论该行 …
因此,如果您已经有二进制文件,可以使用'install_name_tool'在OSX上添加一个rpath,如下所示:
install_name_tool -add_rpath @executable_path/blah
Run Code Online (Sandbox Code Playgroud)
当您构建应用程序包时,xcode会自动执行此操作.
我知道在cmake中你可以使用它来设置共享库的install_name:
set_target_properties(nshared PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@rpath")
Run Code Online (Sandbox Code Playgroud)
我的问题是,为二进制文件添加rpath相当于什么呢?
(对于'为什么你会这样做?',在你的应用程序/文件夹中的任何应用程序上查看otool -l,你会看到很多应用程序的条目如下:
Load command 15
cmd LC_RPATH
cmdsize 36
path @executable_path/../../Frameworks/
Run Code Online (Sandbox Code Playgroud)
这是标准做法.我只是想在cmake中做到这一点)
当我编写接口时,通常可以方便地在与接口相同的包中定义我的测试,然后定义实现接口集的多个包,例如.
package/
package/impl/x <-- Implementation X
package/impl/y <-- Implementation Y
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以在子包中运行相同的测试套件(在本例中,位于package/*_ test.go中)?
我到目前为止提出的最佳解决方案是添加一个测试包:
package/tests/
Run Code Online (Sandbox Code Playgroud)
它实现了测试套件,并在每个实现中进行测试以运行测试,但这有两个缺点:
1)包/测试中的测试不在_test.go文件中,最终成为实际库的一部分,由godoc等记录.
2)包/测试中的测试由自定义测试运行器运行,该测试运行器必须基本上复制'go test'的所有功能以扫描go测试并运行它们.
看起来像一个非常俗气的解决方案.
有没有更好的方法呢?
您如何/可以避免每个Web组件发出服务器请求?
所以,有了javascript,很多人现在正在使用所谓的AMD模块加载模型,其中所有模块都是单独的javascript文件,并根据需要包含在内.例如.
- main.js
-- module1/mod1.js
-- module2/mod2.js
-- module3/mod3.js
Run Code Online (Sandbox Code Playgroud)
这导致对服务器的多个请求,每个javascript文件一个.这被认为对应用程序性能有害,特别是在移动设备中,随着javascript模块数量的增加.
因此,诸如require.js之类的工具提供了一个编译器,它将自动跟踪依赖关系并生成包含其中所有模块的单个javascript文件; 有效地减少了单个文件的请求开销(通常是app-min.js).
每个Web组件都位于外部文件岛中,并使用标头中的链接标记导入:
<link rel="import" href="elements/image-gallery.html">
<link rel="import" href="elements/social-media.html">
<link rel="import" href="elements/pinmap.html">
<link rel="import" href="elements/nav-menu.html">
Run Code Online (Sandbox Code Playgroud)
如果你正在使用聚合物,你可以使用硫化工具来组合聚合物组分(http://www.polymer-project.org/articles/concatenating-web-components.html),但这是因为(据我所知) polymer是一个javascript框架,可以从"polymer-element"标签动态加载Web组件.
使用不依赖于x-tag或聚合物等框架工作的"vanilla"Web组件是否有相同的方法?