我有一个Scrapy spider,它正在使用gettext
来翻译一些字符串。本地化文件存储在/locale/
中。
当我加载翻译时,我使用以下代码进行翻译:
t = gettext.translation('sv', localedir=LOCALE_DIR, languages=['sv'])
LOCALE_DIR
在settings.py中设置,代码如下:
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
LOCALE_DIR = os.path.join(BASE_DIR, 'locale')
当我使用scrapy crawl spider
在本地运行代码时,这非常有效。但当我将它部署到scrapyd
时,它会生成一个.egg文件,并且再也找不到本地化文件。当我从部署的版本打印LOCALE_DIR
时。它给了我/tmp/condobot-1428391146-4QuH3E.egg/locale
。
我想这就是找不到文件的原因。路径是文件的子文件夹,这没有意义。我所期望的是.egg文件将被提取到一个文件夹中,并且路径将指向/tmp/condobot-1428391146-4quh3e/locale
。
- 有没有其他比我目前的方式更好的方式来设置
LOCALE_DIR
的路径?我还尝试将其设置为locale
,但没有任何更好的结果
编辑:我确实使用了一个带有以下代码的setup.py
文件:
from setuptools import setup, find_packages
setup(
name = 'project',
version = '1.0',
packages = find_packages(),
entry_points = {'scrapy': ['settings = condobot.settings']},
package_data = {
# If any package contains *.txt or *.rst files, include them:
'': ['*.mo', '*.po', '*.txt'],
},
)
我还尝试将以下setup.py与MANIFEST.in文件一起使用:
from setuptools import setup, find_packages
setup(
name = 'project',
install_requires = ['distribute'],
version = '1.0',
packages = find_packages(),
entry_points = {'scrapy': ['settings = condobot.settings']},
include_package_data = True,
zip_safe = False,
)
中的歧管
recursive-include locale *
recursive-include condobot/locale *
我的文件结构如下:
- condobot
- locale
- sv
- LC_MESSAGES
sv.mo
pipelines.py
settings.py
- locale
- sv
- LC_MESSAGES
sv.mo
MANIFEST.in
requirements.txt
scrapy.cfg
setup.py
(我已经将/loce/文件夹放在/和/condobot/中,只是为了确保路径没有错误。)
我已经提取了.egg文件,我可以确认它确实包括/locale/
文件夹,在/locale/
文件夹中有/locale/sv/LC_MESSAGES/sv.mo
和/locale/sv/LC_MESSAGES/sv.po
。
因此,问题似乎并不在于setup.py文件没有包括.egg
文件中的文件。路径/......./file.egg/locale/
似乎不起作用。
在python模块打包为egg后,确保任何其他非源文件都可以访问的一种方法是将zip_safe
指定为False
,以便在安装时完全提取包,即:
setup(
name = 'project',
version = '1.0',
...
zip_safe = False,
)