本文整理汇总了Python中weka.core.jvm.start函数的典型用法代码示例。如果您正苦于以下问题:Python start函数的具体用法?Python start怎么用?Python start使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了start函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Python代码示例。
示例1: main
def main():
"""
Runs a datagenerator from the command-line. Calls JVM start/stop automatically.
Use -h to see all options.
"""
parser = argparse.ArgumentParser(
description='Executes a data generator from the command-line. Calls JVM start/stop automatically.')
parser.add_argument("-j", metavar="classpath", dest="classpath", help="additional classpath, jars/directories")
parser.add_argument("-X", metavar="heap", dest="heap", help="max heap size for jvm, e.g., 512m")
parser.add_argument("datagenerator", help="data generator classname, e.g., "
+ "weka.datagenerators.classifiers.classification.LED24")
parser.add_argument("option", nargs=argparse.REMAINDER, help="additional data generator options")
parsed = parser.parse_args()
jars = []
if parsed.classpath is not None:
jars = parsed.classpath.split(os.pathsep)
jvm.start(jars, max_heap_size=parsed.heap, packages=True)
logger.debug("Commandline: " + join_options(sys.argv[1:]))
try:
generator = DataGenerator(classname=parsed.datagenerator)
if len(parsed.option) > 0:
generator.options = parsed.option
DataGenerator.make_data(generator, parsed.option)
except Exception, e:
print(e)
开发者ID:eulersantana,项目名称:python-weka-wrapper,代码行数:28,代码来源:datagenerators.py
示例2: main
def main():
"""
Runs a associator from the command-line. Calls JVM start/stop automatically.
Use -h to see all options.
"""
parser = argparse.ArgumentParser(
description='Executes an associator from the command-line. Calls JVM start/stop automatically.')
parser.add_argument("-j", metavar="classpath", dest="classpath", help="additional classpath, jars/directories")
parser.add_argument("-X", metavar="heap", dest="heap", help="max heap size for jvm, e.g., 512m")
parser.add_argument("-t", metavar="train", dest="train", required=True, help="training set file")
parser.add_argument("associator", help="associator classname, e.g., weka.associations.Apriori")
parser.add_argument("option", nargs=argparse.REMAINDER, help="additional associator options")
parsed = parser.parse_args()
jars = []
if parsed.classpath is not None:
jars = parsed.classpath.split(os.pathsep)
jvm.start(jars, max_heap_size=parsed.heap, packages=True)
logger.debug("Commandline: " + join_options(sys.argv[1:]))
try:
associator = Associator(classname=parsed.associator)
if len(parsed.option) > 0:
associator.options = parsed.option
loader = converters.loader_for_file(parsed.train)
data = loader.load_file(parsed.train)
associator.build_associations(data)
print(str(associator))
except Exception, e:
print(e)
开发者ID:eulersantana,项目名称:python-weka-wrapper,代码行数:32,代码来源:associations.py
示例3: simpleKMeansTrain
def simpleKMeansTrain(self, dataf, options, mname, temp=True):
'''
:param data: -> data to be clustered
:param options: -> SimpleKMeans options
N -> number of clusters
A -> Distance function to use (ex: default is "weka.core.EuclideanDistance -R first-last")
l -> maximum number of iterations default 500
num-slots -> number of execution slots, 1 means no parallelism
S -> Random number seed (default 10)
example => ["-N", "10", "-S", "10"]
:return:
'''
try:
jvm.start(max_heap_size=self.wHeap)
data = self.loadData(dataf, temp=True)
clusterer = Clusterer(classname="weka.clusterers.SimpleKMeans", options=options)
clusterer.build_clusterer(data)
print clusterer
# cluster the data
for inst in data:
cl = clusterer.cluster_instance(inst) # 0-based cluster index
dist = clusterer.distribution_for_instance(inst) # cluster membership distribution
print("cluster=" + str(cl) + ", distribution=" + str(dist))
self.saveModel(clusterer, 'skm', mname)
except Exception, e:
print(traceback.format_exc())
开发者ID:igabriel85,项目名称:dmon-adp,代码行数:26,代码来源:dweka.py
示例4: runclustermodel
def runclustermodel(self, model, method, dataf, temp=True):
anomalies = []
try:
jvm.start(max_heap_size=self.wHeap)
data = self.loadData(dataf, temp)
cluster = self.loadClusterModel(model, method)
clusterMembership = []
print cluster.number_of_clusters
for inst in data:
try:
cl = cluster.cluster_instance(inst)
except Exception as inst:
logger.error('[%s] : [ERROR] Mismatch model and data attributes',
datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'))
dist = cluster.distribution_for_instance(inst)
print ("cluster=" + str(cl) + ", distribution=" + str(dist))
clusterMembership.append(cl)
# print data.attribute_by_name('key')
# print data.num_instances
# print data.get_instance(3)
pa = self.calcThreashold(dict(Counter(clusterMembership)), 21)
if pa == 0:
logger.warning('[%s] : [WARN] Most instances are computed as anomalies, possible error encountered!',
datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'),)
print "Most instances are computed as anomalies, possible error encountered!"
else:
for a in pa:
# print data.get_instance(a).get_value(0) #todo always set key as first atribute
anomalies.append(data.get_instance(a).get_value(0))
print "Detected using %s anomalies at timestamp(s) %s" % (model, str(anomalies))
except Exception, e:
print(traceback.format_exc())
开发者ID:igabriel85,项目名称:dmon-adp,代码行数:35,代码来源:dweka.py
示例5: read_file
def read_file(file_name):
tile_set_list = []
characteristic = []
jvm.start()
nmrClass = Classifier(jobject=serialization.read("models/lmt_3sd.model"))
with open(file_name) as f: # opens file
# reads in characteristic protein sequence and coverts it to expected chemical shift values
tile_characteristic = f.readline()
characteristic = re.findall(r'\b[A-Za-z]{3,4}\b', tile_characteristic)
characteristic = letters_to_numbers(characteristic)
for line in f: # reads in NMR Data
#reads each line and grabs numbers and na data
#file format "a b c d"
a, b, c, d = re.findall(r'\b\d+\.\d*\b|\bna\b', line)
# Dealing with missing data
if (a == "na"):
a = -1
if (b == "na"):
b = -1
if (c == "na"):
c = -1
if (d == "na"):
d = -1
# adds a new Tile to tile_set_list
if (not (a==-1 and b==-1 and c==-1 and d==-1)):
tile_set_list.append(Tile(a, b, c, d, nmrClass))
return tile_set_list, characteristic, nmrClass
开发者ID:Joel-Venzke,项目名称:Automated-nmr-assignment,代码行数:29,代码来源:search_strategies.py
示例6: main
def main():
"""
Runs a clusterer from the command-line. Calls JVM start/stop automatically.
Use -h to see all options.
"""
parser = argparse.ArgumentParser(
description='Performs clustering from the command-line. Calls JVM start/stop automatically.')
parser.add_argument("-j", metavar="classpath", dest="classpath", help="additional classpath, jars/directories")
parser.add_argument("-X", metavar="heap", dest="heap", help="max heap size for jvm, e.g., 512m")
parser.add_argument("-t", metavar="train", dest="train", required=True, help="training set file")
parser.add_argument("-T", metavar="test", dest="test", help="test set file")
parser.add_argument("-d", metavar="outmodel", dest="outmodel", help="model output file name")
parser.add_argument("-l", metavar="inmodel", dest="inmodel", help="model input file name")
parser.add_argument("-p", metavar="attributes", dest="attributes", help="attribute range")
parser.add_argument("-x", metavar="num folds", dest="numfolds", help="number of folds")
parser.add_argument("-s", metavar="seed", dest="seed", help="seed value for randomization")
parser.add_argument("-c", metavar="class index", dest="classindex", help="1-based class attribute index")
parser.add_argument("-g", metavar="graph", dest="graph", help="graph output file (if supported)")
parser.add_argument("clusterer", help="clusterer classname, e.g., weka.clusterers.SimpleKMeans")
parser.add_argument("option", nargs=argparse.REMAINDER, help="additional clusterer options")
parsed = parser.parse_args()
jars = []
if parsed.classpath is not None:
jars = parsed.classpath.split(os.pathsep)
params = []
if parsed.train is not None:
params.extend(["-t", parsed.train])
if parsed.test is not None:
params.extend(["-T", parsed.test])
if parsed.outmodel is not None:
params.extend(["-d", parsed.outmodel])
if parsed.inmodel is not None:
params.extend(["-l", parsed.inmodel])
if parsed.attributes is not None:
params.extend(["-p", parsed.attributes])
if parsed.numfolds is not None:
params.extend(["-x", parsed.numfolds])
if parsed.seed is not None:
params.extend(["-s", parsed.seed])
if parsed.classindex is not None:
params.extend(["-c", parsed.classindex])
if parsed.graph is not None:
params.extend(["-g", parsed.graph])
jvm.start(jars, max_heap_size=parsed.heap, packages=True)
logger.debug("Commandline: " + join_options(sys.argv[1:]))
try:
clusterer = Clusterer(classname=parsed.clusterer)
if len(parsed.option) > 0:
clusterer.options = parsed.option
print(ClusterEvaluation.evaluate_clusterer(clusterer, params))
except Exception as e:
print(e)
finally:
jvm.stop()
开发者ID:fracpete,项目名称:python-weka-wrapper3,代码行数:57,代码来源:clusterers.py
示例7: generate_folds
def generate_folds(dataset_path, output_folder, n_folds=10, random_state=None):
"""
Given a dataset df, generate n_folds for it and store them in <output_folder>/<dataset_name>.
:type dataset_path: str
:param dataset_path: Path to dataset with .arff file extension (i.e my_dataset.arff)
:type output_folder: str
:param output_folder: Path to store both index file with folds and fold files.
:type n_folds: int
:param n_folds: Optional - Number of folds to split the dataset into. Defaults to 10.
:type random_state: int
:param random_state: Optional - Seed to use in the splitting process. Defaults to None (no seed).
"""
import warnings
warnings.filterwarnings('error')
dataset_name = dataset_path.split('/')[-1].split('.')[0]
af = load_arff(dataset_path)
df = load_dataframe(af)
skf = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=random_state)
fold_iter = skf.split(df[df.columns[:-1]], df[df.columns[-1]])
fold_index = dict()
jvm.start()
csv_loader = Loader(classname="weka.core.converters.CSVLoader")
arff_saver = Saver(classname='weka.core.converters.ArffSaver')
for i, (arg_rest, arg_test) in enumerate(fold_iter):
fold_index[i] = list(arg_test)
_temp_path = 'temp_%s_%d.csv' % (dataset_name, i)
fold_data = df.loc[arg_test] # type: pd.DataFrame
fold_data.to_csv(_temp_path, sep=',', index=False)
java_arff_dataset = csv_loader.load_file(_temp_path)
java_arff_dataset.relationname = af['relation']
java_arff_dataset.class_is_last()
arff_saver.save_file(java_arff_dataset, os.path.join(output_folder, '%s_fold_%d.arff' % (dataset_name, i)))
os.remove(_temp_path)
json.dump(
fold_index, open(os.path.join(output_folder, dataset_name + '.json'), 'w'), indent=2
)
jvm.stop()
warnings.filterwarnings('default')
开发者ID:henryzord,项目名称:forrestTemp,代码行数:53,代码来源:dataset.py
示例8: run
def run(arff_path, model_out):
jvm.start()
loader = Loader(classname = "weka.core.converters.ArffLoader")
data = loader.load_file(arff_path)
data.class_is_last()
cls = Logistic()
cls.build_classifier(data)
cls.save_model(model_out)
coefficients = cls.coefficients
for coeff in coefficients:
print str(coeff)
return coefficients
开发者ID:mfomicheva,项目名称:metric-dev,代码行数:13,代码来源:weka_logistic_wrapper.py
示例9: start
def start(*args, **kwargs):
"""
Open a weka connection.
May be called multiple times, but not after calling stop().
Arguments:
*args, **kwargs: Any additional arguments to pass to
jvm.start().
"""
if MODULE_SUPPORTED:
jvm.start(*args, **kwargs)
开发者ID:ChrisCummins,项目名称:phd,代码行数:13,代码来源:ml.py
示例10: assign_classify
def assign_classify(file_location, output="classified.out", model="naivebayes.model"):
data = read_csv_file(file_location)
jvm.start()
# load clusters
obj = serialization.read(model)
classifier = Classifier(jobject=obj)
# create file with cluster group
with open(output, 'w') as cluster_file:
for index, attrs in enumerate(data):
inst = Instance.create_instance(attrs[1:])
pred = classifier.classify_instance(inst)
print(str(index + 1) + ": label index=" + str(pred))
jvm.stop()
开发者ID:whaleforever,项目名称:carilogo,代码行数:13,代码来源:classify.py
示例11: predict
def predict(attributes):
jvm.start()
file_path = print_to_file(attributes)
# load the saved model
objects = serialization.read_all("/Users/hosyvietanh/Desktop/data_mining/trained_model.model")
classifier = Classifier(jobject=objects[0])
loader = Loader(classname="weka.core.converters.ArffLoader")
data = loader.load_file(file_path)
data.class_is_last()
for index, inst in enumerate(data):
pred = classifier.classify_instance(inst)
dist = classifier.distribution_for_instance(inst)
return int(pred)
jvm.stop()
开发者ID:davidnd,项目名称:data-mining,代码行数:14,代码来源:weka_app.py
示例12: query_instance
def query_instance(attributes, model="out.model"):
"""
get the cluster for defined attributes
:params attributes: array or list
:returns: cluster id
"""
jvm.start()
# create instance
inst = Instance(attributes)
# load model
obj = serialization.read(model)
# load cluster and get the cluster_id
cluster = Clusterer(jobject=obj)
cluster_id = cluster.cluster_instance(inst)
jvm.stop()
return cluster_id
开发者ID:whaleforever,项目名称:carilogo,代码行数:16,代码来源:classify.py
示例13: main
def main():
"""
Runs attribute selection from the command-line. Calls JVM start/stop automatically.
Use -h to see all options.
"""
parser = argparse.ArgumentParser(
description='Performs attribute selection from the command-line. Calls JVM start/stop automatically.')
parser.add_argument("-j", metavar="classpath", dest="classpath", help="additional classpath, jars/directories")
parser.add_argument("-X", metavar="heap", dest="heap", help="max heap size for jvm, e.g., 512m")
parser.add_argument("-i", metavar="input", dest="input", required=True, help="input file")
parser.add_argument("-c", metavar="class index", dest="classindex", help="1-based class attribute index")
parser.add_argument("-s", metavar="search", dest="search", help="search method, classname and options")
parser.add_argument("-x", metavar="num folds", dest="numfolds", help="number of folds")
parser.add_argument("-n", metavar="seed", dest="seed", help="the seed value for randomization")
parser.add_argument("evaluator", help="evaluator classname, e.g., weka.attributeSelection.CfsSubsetEval")
parser.add_argument("option", nargs=argparse.REMAINDER, help="additional evaluator options")
parsed = parser.parse_args()
jars = []
if parsed.classpath is not None:
jars = parsed.classpath.split(os.pathsep)
params = []
if parsed.input is not None:
params.extend(["-i", parsed.input])
if parsed.classindex is not None:
params.extend(["-c", parsed.classindex])
if parsed.search is not None:
params.extend(["-s", parsed.search])
if parsed.numfolds is not None:
params.extend(["-x", parsed.numfolds])
if parsed.seed is not None:
params.extend(["-n", parsed.seed])
jvm.start(jars, max_heap_size=parsed.heap, packages=True)
logger.debug("Commandline: " + join_options(sys.argv[1:]))
try:
evaluation = ASEvaluation(classname=parsed.evaluator)
if len(parsed.option) > 0:
evaluation.options = parsed.option
print(AttributeSelection.attribute_selection(evaluation, params))
except Exception as e:
print(e)
finally:
jvm.stop()
开发者ID:fracpete,项目名称:python-weka-wrapper3,代码行数:45,代码来源:attribute_selection.py
示例14: dict2arff
def dict2arff(self, fileIn, fileOut):
'''
:param fileIn: name of csv file
:param fileOut: name of new arff file
:return:
'''
dataIn = os.path.join(self.dataDir, fileIn)
dataOut = os.path.join(self.dataDir, fileOut)
logger.info('[%s] : [INFO] Starting conversion of %s to %s', datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'), dataIn, dataOut)
try:
jvm.start()
convertCsvtoArff(dataIn, dataOut)
except Exception as inst:
pass
finally:
logger.error('[%s] : [ERROR] Exception occured while converting to arff with %s and %s', datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'), type(inst), inst.args)
jvm.stop()
logger.info('[%s] : [INFO] Finished conversion of %s to %s', datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'), dataIn, dataOut)
开发者ID:igabriel85,项目名称:dmon-adp,代码行数:18,代码来源:dataformatter.py
示例15: classify
def classify(train, test, name="RF", tuning=False):
jvm.start()
if isinstance(train, list) and isinstance(test, list):
train = weka_instance(train)
trn_data = converters.load_any_file(train)
test = weka_instance(test)
tst_data = converters.load_any_file(test)
elif os.path.isfile(train) and os.path.isfile(test):
trn_data = converters.load_any_file(train)
tst_data = converters.load_any_file(test)
else:
trn = csv_as_ndarray(train)
tst = csv_as_ndarray(test)
trn_data = converters.ndarray_to_instances(trn, relation="Train")
tst_data = converters.ndarray_to_instances(tst, relation="Test")
trn_data.class_is_last()
tst_data.class_is_last()
# t = time()
if tuning:
opt = tune(train)
else:
opt = default_opt
# print("Time to tune: {} seconds".format(time() - t))
cls = Classifier(classname=classifiers[name.lower()], options=opt)
cls.build_classifier(trn_data)
distr = [cls.distribution_for_instance(inst)[1] for inst in tst_data]
preds = [cls.classify_instance(inst) for inst in tst_data]
jvm.stop()
return preds, distr
开发者ID:rahlk,项目名称:Bellwether,代码行数:40,代码来源:classifier.py
示例16: dbscanTrain
def dbscanTrain(self, dataf, options, mname, temp=True):
'''
:param data: -> data to be clustered
:param options: -> dbscan options
E -> epsilon (default = 0.9)
M -> minPoints (default = 6)
D -> default weka.clusterers.forOPTICSAndDBScan.DataObjects.EuclideanDataObject
I -> index (database) used for DBSCAN (default = weka.clusterers.forOPTICSAndDBScan.Databases.SequentialDatabase)
example => ["-E", "0.9", "-M", "6", "-I", "weka.clusterers.forOPTICSAndDBScan.Databases.SequentialDatabase", "-D", "weka.clusterers.forOPTICSAndDBScan.DataObjects.EuclideanDataObject"]
:return:
'''
try:
jvm.start(max_heap_size=self.wHeap)
data = self.loadData(dataf, temp)
clusterDBSCAN = Clusterer(classname="weka.clusterers.DBSCAN", options=options)
clusterDBSCAN.build_clusterer(data)
print clusterDBSCAN
self.saveModel(clusterDBSCAN, 'dbscan', mname)
# cluster the data
except Exception, e:
print(traceback.format_exc())
开发者ID:igabriel85,项目名称:dmon-adp,代码行数:22,代码来源:dweka.py
示例17: emTrain
def emTrain(self, dataf, options, mname, temp=True):
'''
:param data: -> data to be clustered
:param options: -> EM options
I -> number of iterations
N -> number of clusters
M -> Minimum standard deviation for normal density (default=1.0E-6)
num-slots -> number of execution slots, 1 means no parallelism
S -> random seed (default=100)
example => ["-I", "1000", "-N", "6", "-X", "10", "-max", "-1", "-ll-cv", "1.0E-6",
"-ll-iter", "1.0E-6", "-M", "1.0E-6", "-num-slots", "1", "-S", "100"]
:return:
'''
try:
jvm.start(max_heap_size=self.wHeap)
data = self.loadData(dataf, temp)
clusterEM = Clusterer(classname="weka.clusterers.EM",
options=options)
clusterEM.build_clusterer(data)
print clusterEM
self.saveModel(clusterEM, 'em', mname, )
except Exception, e:
print(traceback.format_exc())
开发者ID:igabriel85,项目名称:dmon-adp,代码行数:23,代码来源:dweka.py
示例18: playback_speed_checker
def playback_speed_checker(inputFile, dirRef):
TRAINING_ARFF = 'dataset_playback.arff'
inputRef = ""
# Start JVM
jvm.start()
jvm.start(system_cp=True, packages=True)
jvm.start(max_heap_size="512m")
# Find reference file
for file in os.listdir(dirRef):
if str(file).find(str(os.path.basename(inputFile))) != -1:
inputRef = os.path.join(dirRef, file)
break
# Calculation distance
(result, distance) = dtw_checker(inputFile, inputRef)
# Loading data
loader = Loader(classname="weka.core.converters.ArffLoader")
data = loader.load_file(TRAINING_ARFF)
data.class_is_last() # set class attribute
# Train the classifier
#cls = Classifier(classname="weka.classifiers.functions.SMO")
cls = Classifier(classname="weka.classifiers.trees.J48", options = ["-C", "0.3", "-M", "10"])
cls.build_classifier(data)
# Classify instance
speed_instance = Instance.create_instance(numpy.ndarray(distance), classname='weka.core.DenseInstance', weight=1.0)
speed_instance.dataset = data
# Classify instance
speed_flag = cls.classify_instance(speed_instance)
if (distance == 0):
speed_class = 'nominal'
else:
if speed_flag == 0: speed_class = 'down_speed'
if speed_flag == 0: speed_class = 'up_speed'
# print os.path.basename(inputFile) + ' --- ' + speed_class
# Stop JVM
jvm.stop()
print "SPEED IS: " + speed_class
return speed_class
开发者ID:ignasi42,项目名称:defect_detector,代码行数:50,代码来源:playback_speed_checker_final.py
示例19: riaa_checker
def riaa_checker(inputFile):
TRAINING_ARFF = 'C:\Users\ASUS\Desktop\IGNASI\SMC\Workspace\dataset_riaa.arff'
# Start JVM
jvm.start()
jvm.start(system_cp=True, packages=True)
jvm.start(max_heap_size="512m")
# Calculation of bark bands information
(absolute_bark, relative_bark, bark_ratios) = compute_bark_spectrum(inputFile)
# Loading data
loader = Loader(classname="weka.core.converters.ArffLoader")
data = loader.load_file(TRAINING_ARFF)
data.class_is_last() # set class attribute
# Train the classifier
cls = Classifier(classname="weka.classifiers.functions.SMO")
#cls = Classifier(classname="weka.classifiers.trees.J48", options = ["-C", "0.3", "-M", "10"])
cls.build_classifier(data)
# Classify instance
bark_instance = Instance.create_instance(bark_ratios, classname='weka.core.DenseInstance', weight=1.0)
bark_instance.dataset = data
# Classify instance
riaa_flag = cls.classify_instance(bark_instance)
if riaa_flag == 0:
riaa_class = 'riaa_ok'
else:
riaa_class = 'riaa_ko'
# print os.path.basename(inputFile) + ' --- ' + riaa_class
# Stop JVM
jvm.stop()
print "RIAA FILTERING?: " + riaa_class
return riaa_class
开发者ID:ignasi42,项目名称:defect_detector,代码行数:42,代码来源:riaa_checker_final.py
示例20: batch_riaa_checking
def batch_riaa_checking(inputDir):
# Start JVM
jvm.start()
jvm.start(system_cp=True, packages=True)
jvm.start(max_heap_size="512m")
riaa_ok = 0
riaa_ko = 0
for file in os.listdir(inputDir):
if file.endswith(".wav"):
riaa_flag = riaa_checker(os.path.join(inputDir, file))
if (riaa_flag == 'riaa_ko'): riaa_ko+=1
if (riaa_flag == 'riaa_ok'): riaa_ok+=1
# Stop JVM
jvm.stop()
return (riaa_ko, riaa_ok)
开发者ID:ignasi42,项目名称:defect_detector,代码行数:20,代码来源:riaa_checker_final.py
注:本文中的weka.core.jvm.start函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论