【问题标题】:How to import packages in virtualenv in python shell如何在 python shell 中的 virtualenv 中导入包
【发布时间】:2016-07-06 07:36:10
【问题描述】:

我正在尝试制作一个功能来定期向用户发送通知,尤其是 ios 移动设备。

具体来说,我使用 pythonanywhere 的“计划任务”。 (https://help.pythonanywhere.com/pages/ScheduledTasks)

这是我发送通知的脚本。

#!/usr/local/bin/python3.4
import sys,os,django
sys.path.append("/home/lkm/Folder/project/")
sys.path.append("/home/lkm/Folder/project/app/myvenv/")
print(sys.path)
os.environ["DJANGO_SETTINGS_MODULE"] = "project.settings"
from push_notifications.models import APNSDevice, GCMDevice
device = APNSDevice.objects.all()
if device is None:
    print('No Device')
message = 'Home Fried Potatoes, Yo-nola Bar, Soup du Jour, More...'
device.send_message(message)

但是在'from push_notifications.models import APNSDevice, GCMDevice'这一行 我收到一个错误:

'ImportError: No module named 'push_notifications'

我认为是因为 push_notifications 包在 virtualenv 的包中,在 mycase 'myvenv' 目录中,所以没有导入 virtualenv。

但即使我通过 'ImportError: No module named 'push_notifications' 导入了 'myvenv'。

同样的错误,请问有解决办法吗?

更新(第一个脚本,第二个错误消息)

#!/home/lkm/folder/project/app/myvenv/bin/python
import sys,os,django
sys.path.append("/home/lkm/folder/project/application/myvenv/bin/../lib/python/site-packages")
print(sys.path)
os.environ["DJANGO_SETTINGS_MODULE"] = "project.settings"
from push_notifications.models import APNSDevice, GCMDevice
device = APNSDevice.objects.all()
if device is None:
    print('No Device')
message = 'Home Fried Potatoes, Yo-nola Bar, Soup du Jour, More...'
device.send_message(message)

['/home/lkm/folder/project/application', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages', '/home/lkm/folder/project/application/myvenv/bin/../lib/python/site-packages']

Traceback(最近一次调用最后一次):文件 “/home/lkm/folder/project/application/schedule.py”,第 9 行,在 from push_notifications.models import APNSDevice, GCMDevice ImportError: No module named 'push_notifications'

【问题讨论】:

  • push_notifications 的确切位置在哪里?我认为您需要使用importimporterror 标签而不是django,因为这与django 无关。
  • @TadhgMcDonald-Jensen 正如我上面所说,'push_notifications' 包是通过 pip install ~ 在激活 myvenv virtualenv 后安装的。
  • 你没有在原帖中说明你是如何安装的。
  • @TadhgMcDonald-Jensen 我不知道你在说什么……发帖?
  • 在你的问题中,see this

标签: python django python-3.x virtualenv


【解决方案1】:

我会更改 shebang 以在您的虚拟环境中使用 Python。

#!/home/lkm/Folder/project/app/myvenv/bin/python

那么你不应该将虚拟环境附加到python路径,你可以删除以下行。

sys.path.append("/home/lkm/Folder/project/app/myvenv/")

但是,如果您真的想手动将虚拟 env 目录添加到 Python 路径,那么我认为您希望包含 site-packages 目录:

sys.path.append("/home/lkm/Folder/project/app/myvenv/python3.4/site-packages")

【讨论】:

  • 感谢您的回复!但我实际上之前尝试过,但什么也没发生......谢谢
  • 哇,然后我收到另一条错误消息'ImportError:没有名为'project'的模块
  • 虽然我在 sys.paht 中看到了那个项目的路径……但很恶心
  • 我不确定“但什么也没发生”是什么意思。很难提供帮助,因为您没有展示您的项目布局或完整的回溯。
  • 我不是故意的,对不起@Alasdair,我更新了我得到的东西。
【解决方案2】:

你是如何执行文件的? 我看到你有:

#!/usr/local/bin/python3.4

这意味着如果您正在执行文件:

./file.py

它将由系统解释器执行。

你需要激活环境:

$ source env/bin/activate

并使用以下命令执行文件:

$ python file.py

FWIW,我认为最干净的解决方案是为您的项目设置一个setup.py scriptpackages= 参数是最重要的)并定义一个entry point,类似于:

entry_points = {
    'console_scripts': ['my-script=my_package.my_module:main'],
}

然后你在激活环境后运行python setup.py develop 并且您可以将脚本简单地作为命令运行:

$ my-script

【讨论】:

  • 哦,这也是我的另一个问题!是的,但我认为 pythonanywhere 只是执行我的脚本而没有激活源......是的,你是对的。
猜你喜欢
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多