TLDR :在try{}catch
中创建可导入文件的最简单方法是什么?
这是初学者的问题。
我已经学习了Scala
几个星期,现在有一些代码可以在几个文件/不同项目之间共享。我尝试了很多导入结构,但没有一个工作。要求是:
Scala
文件。.scala
s,def
和object
s。示例:
case classe
。/some/path/to_be_imported.scala
。/abc/def/will_import01.scala
。我不是要创建一个包或分发它。
考虑到我已经知道的编程语言,看看我如何解决这个问题:
由于我精通/xyz/rst/will_import02.scala
,如果此问题引用Python
,我会给出预期的答案版本:
在这种情况下你可以:
将您的文件放在已执行文件的同一目录中,然后运行:Python
。例如:
python3 ./your_file.py
请注意,它们位于完全相同的目录中(这与上面的第2点相矛盾,但它解决了问题)。
将文件目录添加到➜ another_path|$ python3 ./main_module/main_file.py
1
self printing
➜ another_path|$ tree .
=======================================================================
.
└── main_module
├── main_file.py
├── __pycache__
│ └── sample_file_to_be_imported.cpython-36.pyc
└── sample_file_to_be_imported.py
环境变量,然后运行您的模块(最佳答案):
PYTHONPATH
文件内容:
➜ random_path|$ PYTHONPATH=$PYTHONPATH:./sample_module python3 ./main_module/main_file.py
1
self printing
=======================================================================
➜ random_path|$ tree .
.
├── main_module
│ └── main_file.py
└── sample_module
├── __pycache__
│ └── sample_file_to_be_imported.cpython-36.pyc
└── sample_file_to_be_imported.py
3 directories, 3 files
编辑01:@ felipe-rubin答案不起作用:
➜ random_path|$ cat ./main_module/main_file.py
from sample_file_to_be_imported import func1, Class01
print(func1())
x = Class01()
x.cprint()
=======================================================================
➜ random_path|$ cat ./sample_module/sample_file_to_be_imported.py
def func1():
return 1
class Class01():
def cprint(self):
print('self printing')
答案 0 :(得分:1)
最简单的方法是使用scalac编译.scala文件:
Linux/OSX: scalac mypackage/Example.scala
Windows: scalac mypackage\Example.scala
以上内容应生成.class文件(或更多)。
假设该文件包含一个名为 Example 的类,您可以将其导入其他地方,如下所示:
import mypackage.Example
在编译执行上述导入的其他文件时,您需要拥有' mypackage'在类路径中。使用 -cp 标志调用scalac时,可以将目录添加到类路径中:
Linux/OSX: scalac -cp .:path/to/folder/where/mypackage/is/located AnotherExample.scala
Windows: scalac -cp .;path\to\folder\where\mypackage\is\located AnotherExample.scala
为更大的项目执行此操作变得复杂,在这种情况下,您可能需要使用构建工具(例如SBT)或IDE(例如IntelliJ Idea)来为您完成复杂的工作。
答案 1 :(得分:0)
我终于有了这个工作。感谢其他答案的宝贵意见。
我将每个路径,文件和对象的名称多样化为尽可能通用。这可能不遵循scala社区的指导原则,但却是我能找到的最明确的说明性帮助。项目布局:
文件布局
$ tree /tmp/scala_stack_exchange
/tmp/scala_stack_exchange
├── anotherpath
│ ├── file_defines_class.scala
│ └── some_package_name
│ ├── MyObj.class
│ └── MyObj$.class
└── path01
└── myprogram.scala
3 directories, 4 files
我希望运行myprogram.scala
,它应该导入file_defines_class.scala
中定义的类。
<强>制备强>
编译要由其他模块导入的文件:
cd /tmp/scala_stack_exchange/anotherpath && scalac ./file_defines_class.scala
<强>执行强>
cd /tmp/scala_stack_exchange/path01 && scala -cp /tmp/scala_stack_exchange/anotherpath/ ./myprogram.scala
<强>结果
myobj time
文件内容
// /tmp/scala_stack_exchange/path01/myprogram.scala
import some_package_name.MyObj
val x = new MyObj(10)
x.time()
// /tmp/scala_stack_exchange/anotherpath/file_defines_class.scala
package some_package_name
object MyObj
case class MyObj(i: Int) {
def time(): Unit = println("myobj time")
}
感觉像魔术一样。然而,整个过程相当麻烦:/