gpt4 book ai didi

python - 当通过符号链接(symbolic link)访问文件时,如何让我的 Django manage.py 正常工作?

转载 作者:IT王子 更新时间:2023-10-29 00:32:17 26 4
gpt4 key购买 nike

问题

尝试运行我的自定义 Django 管理命令之一 (send_notify_emails) 时,出现以下错误:

$ python web_apps/manage.py send_notify_emails
Traceback (most recent call last):
File "web_apps/manage.py", line 11, in <module>
execute_manager(settings)
File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 436, in execute_manager
setup_environ(settings_mod)
File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 419, in setup_environ
project_module = import_module(project_name)
File "/usr/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
ImportError: No module named my_django_app-1.0

背景

我有一个 Django 网站,里面有两个应用程序。站点目录(包括应用程序模块目录,以及 settings.py、urls.py 和 manage.py)的路径是 /srv/web_apps。这是指向 /usr/share/my_django_app-1.0 的符号链接(symbolic link),它是生产发布标签的 svn export。这样我就可以通过将符号链接(symbolic link)移动到新生产版本的路径来更改我的应用程序版本,并在需要时轻松改回早期版本。

我的 django.wsgi 文件将 /srv/srv/web_apps 添加到 Python 路径,以便 mod_wsgi 可以找到我的设置和 url 文件,以及应用程序模块。

my_django_app-1.0 出现的唯一地方是目录路径,它不在我的 settings.py 或其他地方,所以 Django 必须获取模块名称从路径。

似乎 正在发生的是 Django 通过遵循符号链接(symbolic link)并使用目标文件夹的名称而不是符号链接(symbolic link)本身来解析我的应用程序的包名称。当我运行 manage.py 时,Django 在应该导入 web_apps 时尝试导入 my_django_app-1.0

最佳答案

I have a Django site with two apps in it. The path to the site directory (which includes the app module directories, as well as settings.py, urls.py and manage.py) is /srv/web_apps. This is a symbolic link to /usr/share/my_django_app-1.0, which is an svn export of a production release tag. This way I can change my app version over by just moving the symbolic link to the path for the new production version, and easily change back to an earlier release if I need to.

您所描述的基本上就是人们如此喜欢 virtualenv 的确切原因。我建议通读一下 mod_wsgi Virtual Environments .

问题是 __file__ 返回符号链接(symbolic link)的相对路径取决于关于它从哪里导入(在符号链接(symbolic link)路径中..),这就是它的报告方式这是家。由于目录是模块的基本结构,如果你有一个目录在其中包含 __init__.py,那么无论该目录被命名为“name”如果你导入它。

您也许可以覆盖此行为,但这样做是错误的东西 - 检查 virtualenv,或者为每个版本设置单独的目录,然后使用下划线而不是句点。 myApp_1_0_0

考虑以下场景

mkdir real_directory
ln -s real_directory symlink_directory
cat >>real_directory/__init__.py <<EOF
import os
print
print '__name__ == %s' % (__name__)
print '__file__ == %s' % (__file__)
print ' abspath == %s' % os.path.abspath(__file__)
print 'realpath == %s' % os.path.realpath(os.path.abspath(__file__))
print
EOF

python -c "import real_directory"

__name__ == real_directory
__file__ == real_directory/__init__.py
abspath == /Users/nar/pt/real_directory/__init__.py
realpath == /Users/nar/pt/real_directory/__init__.py

python -c "import symlink_directory"

__name__ == symlink_directory
__file__ == symlink_directory/__init__.pyc
abspath == /Users/nar/pt/symlink_directory/__init__.pyc
realpath == /Users/nar/pt/real_directory/__init__.pyc

关于python - 当通过符号链接(symbolic link)访问文件时,如何让我的 Django manage.py 正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com