我对python和ruby都很新。
我已经创建了一个python脚本,可以像这样导入它的依赖项:
import sys
sys.path.append("/usr/share/anki")
from anki import Collection
from anki.importing import TextImporter
如何在RubyPython中实现相同的功能?除其他外,我试过了:
RubyPython.start
sys = RubyPython.import("sys")
sys.path.append("/usr/share/anki")
Collection = RubyPython.import("anki.Collection")
TextImporter = RubyPython.import("anki.importing.TextImporter")
RubyPython.stop
这给了我一个错误:`import': AttributeError: 'module' object has no attribute 'argv' (RubyPython::PythonError)
用于anki.Collection导入的行。
我也尝试过这样的事情:
RubyPython.start
sys = RubyPython.import("sys")
sys.path.append("/usr/share/anki/anki")
Collection = RubyPython.import("collection")
TextImporter = RubyPython.import("anki.importing.TextImporter")
RubyPython.stop
这给了我一个错误:`import': ImportError: No module named anki.lang (RubyPython::PythonError)
用于集合导入的行。您可以从the source code for anki看到这是在collection.py文件中导入的第一件事。
答案 0 :(得分:1)
嵌入了Python解释器,因此有些特定于进程的位是有意义的,例如sys.argv
不可用。
这是一个没有红宝石的快速测试:
In [1]: import sys
In [2]: del sys.argv
In [3]: sys.path.append("anki")
In [6]: import anki.Collection
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-6-ff326ec5c6ff> in <module>()
----> 1 import anki.Collection
/dima/anki/anki/__init__.py in <module>()
32
33 version="2.0.16" # build scripts grep this line, so preserve formatting
---> 34 from anki.storage import Collection
35 __all__ = ["Collection"]
/dima/anki/anki/storage.py in <module>()
4
5 import os, copy, re
----> 6 from anki.lang import _
7 from anki.utils import intTime, json
8 from anki.db import DB
/dima/anki/anki/lang.py in <module>()
103
104 if not currentTranslation:
--> 105 setLang("en_US", local=False)
/dima/anki/anki/lang.py in setLang(lang, local)
82 def setLang(lang, local=True):
83 trans = gettext.translation(
---> 84 'anki', langDir(), languages=[lang], fallback=True)
85 if local:
86 threadLocal.currentLang = lang
/dima/anki/anki/lang.py in langDir()
75 os.path.abspath(__file__)), "locale")
76 if not os.path.isdir(dir):
---> 77 dir = os.path.join(os.path.dirname(sys.argv[0]), "locale")
78 if not os.path.isdir(dir):
79 dir = "/usr/share/anki/locale"
AttributeError: 'module' object has no attribute 'argv'
理想情况下,您的代码不应该依赖于sys.argv
,例如,如果您的模块被其他项目使用,则不能假设sys.argv
中的内容最终结束。
如果您需要代码/资源目录,请改用os.path.dirname(__file__)
(*)
如果您确实需要sys.argv
,请在导入模块之前将假数组注入sys
。
(*)请记住,Python代码也可以作为zip提供,在这种情况下,你甚至没有传统意义上的目录。