如何在Jython中创建一个符号链接

时间:2011-10-14 23:25:54

标签: java jython symlink

我正在开发一个使用Jython 2.2的项目。

似乎Jython 2.2没有os.symlink()或任何可以帮助创建符号链接的东西。

所以我想使用Java createSymbolicLink()。但是createSymbolicLink()需要Java数据类型“Path”,我不知道如何导入Jython ...

有没有人知道如何在Jython中创建符号链接(最好不使用shell命令)?

P.S。我尝试使用Java 1.6.0“createSymbolicLink()”并且它无法工作,因为即使在我执行“import java.nio。*”之后,Java也不会识别“Path”...任何想法......?< / p>

非常感谢!

杰克

1 个答案:

答案 0 :(得分:2)

Java 6中不支持符号链接。使用Java 7,您可以(未经测试):

from java.nio.file import FileSystems # requires Java 7 (July 28, 2011)

def mksymlink(target, path):
    """Make a symlink from target to path."""
    fs = FileSystems.getDefault()
    target, path = [fs.getPath('', [name]) for name in [target, path]]
    path.createSymbolicLink(target)

Jython 2.5已os.symlink()实施using jruby posix module

使用Java 6上的Jython 2.2,您可能需要调用ln

import os
from java.lang import Runtime

def mksymlink(target, path):
    path = os.path.abspath(path)
    process = Runtime.getRuntime().exec(["ln", "-s", target, path]);
    process.waitFor();
    process.destroy();

要批量生成符号链接,您可以与外部python进程通信:

import os
from java.lang import Runtime
from java.io import PrintWriter

class Symlinker:
    def __init__(self, path):
        self.process = Runtime.getRuntime().exec(path)
        self.out = PrintWriter(self.process.getOutputStream())

    def __call__(self, target, path):
        self.out.write("%s\0%s\n" % (target, path))
        self.out.flush()

    def terminate(self):
        self.out.close()
        self.process.waitFor()
        self.process.destroy()

symlinker = Symlinker(["python", "symlinker.py"])

def mksymlink(target, path):
    symlinker(*map(os.path.abspath, [target, path]))

symlinker.py

#!/usr/bin/env python
import os, sys

for line in iter(sys.stdin.readline, ''):
    target, path = line.rstrip('\n').split('\0')
    os.symlink(target, path)

它是Creating Symbolic Links with Java at Runtime的Java / C实现的Jython / Python的翻译。