安装JPype时出错 - 找不到jni.h,权限被拒绝
这是我在StackOverflow上的第一篇帖子。
我正在尝试安装JPype。我在网上查看了很多教程和论坛的内容,但还是没能成功完成安装。
我遇到的错误是:
在文件 src/native/common/jp_array.cpp 的第17行中: src/native/common/include/jpype.h 的第45行第10列:致命错误:找不到 'jni.h' 文件
我使用的是Mac OSX 10.9.3,并且我会使用一个远程服务器。
编辑:我已经解决了找不到jni.h文件的问题。
不过,现在我遇到了这个错误 --> 错误:/Library/Python/2.7/site-packages/_jpype.so: 权限被拒绝
下面是JPype的setup.py代码:
from distutils.core import setup as distSetup, Extension
import os, os.path, sys
class JPypeSetup(object): def init(self) : self.extra_compile_args = [] self.macros = []
def setupFiles(self) :
cpp_files = [
map(lambda x : "src/native/common/"+x, os.listdir("src/native/common")),
map(lambda x : "src/native/python/"+x, os.listdir("src/native/python")),
]
all_src = []
for i in cpp_files :
all_src += i
self.cpp = filter(lambda x : x[-4:] == '.cpp', all_src)
self.objc = filter(lambda x : x[-2:] == '.m', all_src)
def setupWindows(self):
print 'Choosing the Windows profile'
self.javaHome = os.getenv("JAVA_HOME")
if self.javaHome is None :
print "environment variable JAVA_HOME must be set"
sys.exit(-1)
self.jdkInclude = "win32"
self.libraries = ["Advapi32"]
self.libraryDir = [self.javaHome+"/lib"]
self.macros = [ ("WIN32",1) ]
self.extra_compile_args = ['/EHsc']
def setupMacOSX(self):
#self.javaHome = '/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/jni.h'
#self.javaHome = '/System/Library/Frameworks/JavaVM.framework/Versions/'
self.javaHome = '/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/'
self.jdkInclude = ""
self.libraries = ["dl"]
#self.libraryDir = [self.javaHome+"/System/Library"]
self.libraryDir = [self.javaHome+"/Libraries"]
self.macros = [('MACOSX',1)]
def setupLinux(self):
self.javaHome = os.getenv("JAVA_HOME")
if self.javaHome is None :
self.javaHome = '/usr/lib/jvm/java-1.5.0-sun-1.5.0.08' # Ubuntu linux
# self.javaHome = '/usr/java/jdk1.5.0_05'
self.jdkInclude = "linux"
self.libraries = ["dl"]
self.libraryDir = [self.javaHome+"/lib"]
def setupPlatform(self):
if sys.platform == 'win32' :
self.setupWindows()
elif sys.platform == 'darwin' :
self.setupMacOSX()
else:
self.setupLinux()
def setupInclusion(self):
self.includeDirs = [
self.javaHome+"/Headers",
self.javaHome+"/Headers/"+self.jdkInclude,
"src/native/common/include",
"src/native/python/include",
]
def setup(self):
self.setupFiles()
self.setupPlatform()
self.setupInclusion()
jpypeLib = Extension("_jpype",
self.cpp,
libraries=self.libraries,
define_macros=self.macros,
include_dirs=self.includeDirs,
library_dirs=self.libraryDir,
extra_compile_args=self.extra_compile_args
)
distSetup(
name="JPype",
version="0.5.4.2",
description="Python-Java bridge",
author="Steve Menard",
author_email="devilwolf@users.sourceforge.net",
url="http://jpype.sourceforge.net/",
packages=[
"jpype", 'jpype.awt', 'jpype.awt.event',
'jpypex', 'jpypex.swing'],
package_dir={
"jpype" : "src/python/jpype",
'jpypex' : 'src/python/jpypex',
},
ext_modules=[jpypeLib]
)
JPypeSetup().setup()
1 个回答
我找到了我的错误。其实我只需要在运行文件之前加上sudo命令。它看起来像这样 --> sudo python setup.py install
至于jni.h的错误,下面是代码。这个网站对我帮助很大:http://blog.y3xz.com/blog/2011/04/29/installing-jpype-on-mac-os-x
这里是mac安装的setup.py的副本。我在这两个函数setupMacOSX()和setupInclusion()中改了一些代码。
from distutils.core import setup as distSetup, Extension
import os, os.path, sys
class JPypeSetup(object):
def __init__(self) :
self.extra_compile_args = []
self.macros = []
def setupFiles(self) :
cpp_files = [
map(lambda x : "src/native/common/"+x, os.listdir("src/native/common")),
map(lambda x : "src/native/python/"+x, os.listdir("src/native/python")),
]
all_src = []
for i in cpp_files :
all_src += i
self.cpp = filter(lambda x : x[-4:] == '.cpp', all_src)
self.objc = filter(lambda x : x[-2:] == '.m', all_src)
def setupWindows(self):
print 'Choosing the Windows profile'
self.javaHome = os.getenv("JAVA_HOME")
if self.javaHome is None :
print "environment variable JAVA_HOME must be set"
sys.exit(-1)
self.jdkInclude = "win32"
self.libraries = ["Advapi32"]
self.libraryDir = [self.javaHome+"/lib"]
self.macros = [ ("WIN32",1) ]
self.extra_compile_args = ['/EHsc']
def setupMacOSX(self):
#I changed the line below. This is where my JDK root file was located.
self.javaHome = '/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/'
self.jdkInclude = ""
self.libraries = ["dl"]
#I changed the line below to this:
self.libraryDir = [self.javaHome+"/Libraries"]
self.macros = [('MACOSX',1)]
def setupLinux(self):
self.javaHome = os.getenv("JAVA_HOME")
if self.javaHome is None :
self.javaHome = '/usr/lib/jvm/java-1.5.0-sun-1.5.0.08' # Ubuntu linux
# self.javaHome = '/usr/java/jdk1.5.0_05'
self.jdkInclude = "linux"
self.libraries = ["dl"]
self.libraryDir = [self.javaHome+"/lib"]
def setupPlatform(self):
if sys.platform == 'win32' :
self.setupWindows()
elif sys.platform == 'darwin' :
self.setupMacOSX()
else:
self.setupLinux()
def setupInclusion(self):
self.includeDirs = [
#I changed the line below to Headers.
self.javaHome+"/Headers",
#I changed the line below to Headers.
self.javaHome+"/Headers/"+self.jdkInclude,
"src/native/common/include",
"src/native/python/include",
]
def setup(self):
self.setupFiles()
self.setupPlatform()
self.setupInclusion()
jpypeLib = Extension("_jpype",
self.cpp,
libraries=self.libraries,
define_macros=self.macros,
include_dirs=self.includeDirs,
library_dirs=self.libraryDir,
extra_compile_args=self.extra_compile_args
)
distSetup(
name="JPype",
version="0.5.4.2",
description="Python-Java bridge",
author="Steve Menard",
author_email="devilwolf@users.sourceforge.net",
url="http://jpype.sourceforge.net/",
packages=[
"jpype", 'jpype.awt', 'jpype.awt.event',
'jpypex', 'jpypex.swing'],
package_dir={
"jpype" : "src/python/jpype",
'jpypex' : 'src/python/jpypex',
},
ext_modules=[jpypeLib]
)
JPypeSetup().setup()